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
wilder-work
Andreas Gungl 21 years ago
parent 537269a4fb
commit b0e0336894
  1. 53
      renamejob.cpp
  2. 5
      renamejob.h

@ -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<KMFolderImap*>(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<KMFolderCachedImap*>(mNewFolder->storage());
KMFolderCachedImap* owner = static_cast<KMFolderCachedImap*>(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<KMMsgBase> 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<KMFolder*>(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"

@ -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;

Loading…
Cancel
Save