From b0e0336894ef70ed828454c42993922635c61376 Mon Sep 17 00:00:00 2001 From: Andreas Gungl Date: Sat, 10 Dec 2005 04:41:02 +0000 Subject: [PATCH] Fix moving of nested folders to a non-local destination folder. Messages in the subfolders don't get lost anymore. This functionality is hidden as it was decided to disable the moving of nested folders to IMAP and DIMAP accounts. The change refers to bug report 114985. svn path=/branches/KDE/3.5/kdepim/; revision=487311 --- renamejob.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++++++-- renamejob.h | 5 +++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/renamejob.cpp b/renamejob.cpp index 5cffb2a66..215298e20 100644 --- a/renamejob.cpp +++ b/renamejob.cpp @@ -58,6 +58,7 @@ RenameJob::RenameJob( FolderStorage* storage, const QString& newName, mStorage( storage ), mNewParent( newParent ), mNewName( newName ), mNewFolder( 0 ) { + mStorageTempOpened = 0; mOldName = storage->name(); if ( storage->folderType() == KMFolderTypeImap ) { mOldImapPath = static_cast(storage)->imapPath(); @@ -77,7 +78,8 @@ void RenameJob::execute() // move the folder to a different parent KMFolderType type = mStorage->folderType(); if ( ( type == KMFolderTypeMbox || type == KMFolderTypeMaildir ) && - mNewParent->type() == KMStandardDir ) + mNewParent->type() == KMStandardDir && + mStorage->folderType() != KMFolderTypeCachedImap ) { // local folders can handle this on their own mStorage->rename( mNewName, mNewParent ); @@ -131,7 +133,11 @@ void RenameJob::execute() KMFolderCachedImap* newStorage = static_cast(mNewFolder->storage()); KMFolderCachedImap* owner = static_cast(mNewParent->owner()->storage()); newStorage->initializeFrom( owner ); - slotMoveMessages(); + moveSubFoldersBeforeMessages(); + } else if ( mStorage->folderType() == KMFolderTypeCachedImap ) + { + // from (d)IMAP to local account + moveSubFoldersBeforeMessages(); } else { // local @@ -219,6 +225,8 @@ void RenameJob::slotMoveMessages() mStorage->blockSignals( true ); // move all messages to the new folder QPtrList msgList; + if ( !mStorage->isOpened() ) + mStorageTempOpened = mStorage->open() ? mStorage : 0; for ( int i = 0; i < mStorage->count(); i++ ) { KMMsgBase* msgBase = mStorage->getMsgBase( i ); @@ -240,6 +248,10 @@ void RenameJob::slotMoveMessages() void RenameJob::slotMoveCompleted( KMCommand* command ) { kdDebug(5006) << k_funcinfo << (command?command->result():0) << endl; + if ( mStorageTempOpened ) { + mStorageTempOpened->close(); + mStorageTempOpened = 0; + } if ( command ) { // just make sure nothing bounces disconnect( command, SIGNAL( completed( KMCommand * ) ), @@ -263,6 +275,10 @@ void RenameJob::slotMoveCompleted( KMCommand* command ) config->writeEntry( it.key(), it.data() ); } mNewFolder->readConfig( config ); + // make sure the children state is correct + if ( mNewFolder->child() && + ( mNewFolder->storage()->hasChildren() == FolderStorage::HasNoChildren ) ) + mNewFolder->storage()->updateChildrenState(); // delete the old folder mStorage->blockSignals( false ); @@ -315,4 +331,37 @@ void RenameJob::slotMoveCompleted( KMCommand* command ) delete this; } +void RenameJob::slotMoveSubFolders( QString newName, bool success ) +{ + if ( !success ) { + emit renameDone( newName, false ); + } else { + KMFolderDir* child = mStorage->folder()->child(); + if ( child && child->first() ) + { + KMFolderNode* node = child->first(); + { + FolderStorage* childStorage = static_cast(node)->storage(); + if ( !mNewFolder->child() ) + mNewFolder->createChildFolder(); + RenameJob* job = new RenameJob( childStorage, childStorage->name(), + mNewFolder->child() ); + connect( job, SIGNAL( renameDone( QString, bool ) ), + this, SLOT( slotMoveSubFolders( QString, bool ) ) ); + job->start(); + } + } + else slotMoveMessages(); + } +} + +void RenameJob::moveSubFoldersBeforeMessages() +{ + // move child folders recursive if present - else simply move the messages + KMFolderDir* child = mStorage->folder()->child(); + if ( child ) + slotMoveSubFolders( "", true ); + else slotMoveMessages(); +} + #include "renamejob.moc" diff --git a/renamejob.h b/renamejob.h index 974667146..edfe78852 100644 --- a/renamejob.h +++ b/renamejob.h @@ -73,12 +73,17 @@ protected slots: /** All messages are moved so remove the original folder */ void slotMoveCompleted( KMCommand *command ); + void slotMoveSubFolders( QString newName, bool success ); + signals: /** Emitted when the job is done, check the success bool */ void renameDone( QString newName, bool success ); protected: + void moveSubFoldersBeforeMessages(); + FolderStorage* mStorage; + FolderStorage* mStorageTempOpened; KMFolderDir* mNewParent; QString mNewName; QString mNewImapPath;