00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "renamejob.h"
00030 #include "copyfolderjob.h"
00031 #include "kmfolderimap.h"
00032 #include "kmfoldercachedimap.h"
00033 #include "folderstorage.h"
00034 #include "kmfolder.h"
00035 #include "kmfolderdir.h"
00036 #include "kmfoldermgr.h"
00037 #include "imapaccountbase.h"
00038 #include "kmacctimap.h"
00039 #include "kmacctcachedimap.h"
00040 #include "kmmsgbase.h"
00041
00042 #include <kdebug.h>
00043 #include <kurl.h>
00044 #include <kio/scheduler.h>
00045 #include <kio/job.h>
00046 #include <kio/global.h>
00047 #include <klocale.h>
00048 #include <config.h>
00049
00050 #include <qmap.h>
00051
00052 using namespace KMail;
00053
00054 RenameJob::RenameJob( FolderStorage* storage, const QString& newName,
00055 KMFolderDir* newParent )
00056 : FolderJob( 0, tOther, (storage ? storage->folder() : 0) ),
00057 mStorage( storage ), mNewParent( newParent ),
00058 mNewName( newName ), mNewFolder( 0 ), mCopyFolderJob( 0 )
00059 {
00060 mStorageTempOpened = 0;
00061 if ( storage ) {
00062 mOldName = storage->name();
00063 if ( storage->folderType() == KMFolderTypeImap ) {
00064 mOldImapPath = static_cast<KMFolderImap*>(storage)->imapPath();
00065 } else if ( storage->folderType() == KMFolderTypeCachedImap ) {
00066 mOldImapPath = static_cast<KMFolderCachedImap*>(storage)->imapPath();
00067 }
00068 }
00069 }
00070
00071 RenameJob::~RenameJob()
00072 {
00073 }
00074
00075
00076 void RenameJob::execute()
00077 {
00078 if ( mNewParent )
00079 {
00080
00081 KMFolderType type = mStorage->folderType();
00082 if ( ( type == KMFolderTypeMbox || type == KMFolderTypeMaildir ) &&
00083 mNewParent->type() == KMStandardDir &&
00084 mStorage->folderType() != KMFolderTypeCachedImap )
00085 {
00086
00087 mStorage->rename( mNewName, mNewParent );
00088 emit renameDone( mNewName, true );
00089 deleteLater();
00090 return;
00091 }
00092
00093 mCopyFolderJob = new CopyFolderJob( mStorage, mNewParent );
00094 connect( mCopyFolderJob, SIGNAL(folderCopyComplete(bool)), SLOT(folderCopyComplete(bool)) );
00095 mCopyFolderJob->execute();
00096
00097 } else
00098 {
00099
00100 if ( mStorage->folderType() != KMFolderTypeImap )
00101 {
00102
00103 mStorage->rename( mNewName );
00104 emit renameDone( mNewName, true );
00105 deleteLater();
00106 return;
00107 }
00108 if ( mOldImapPath.isEmpty() )
00109 {
00110
00111 emit renameDone( mNewName, false );
00112 deleteLater();
00113 return;
00114 } else if ( mOldName == mNewName || mOldImapPath == "/INBOX/" ) {
00115 emit renameDone( mNewName, true );
00116 deleteLater();
00117 return;
00118 }
00119 ImapAccountBase* account = static_cast<KMFolderImap*>(mStorage)->account();
00120
00121 mNewImapPath = mOldImapPath;
00122 mNewImapPath = mNewImapPath.replace( mOldName, mNewName );
00123 KURL src( account->getUrl() );
00124 src.setPath( mOldImapPath );
00125 KURL dst( account->getUrl() );
00126 dst.setPath( mNewImapPath );
00127 KIO::SimpleJob *job = KIO::rename( src, dst, true );
00128 kdDebug(5006)<< "RenameJob::rename - " << src.prettyURL()
00129 << " |=> " << dst.prettyURL() << endl;
00130 ImapAccountBase::jobData jd( src.url() );
00131 account->insertJob( job, jd );
00132 KIO::Scheduler::assignJobToSlave( account->slave(), job );
00133 connect( job, SIGNAL(result(KIO::Job*)),
00134 SLOT(slotRenameResult(KIO::Job*)) );
00135 }
00136 }
00137
00138 void RenameJob::slotRenameResult( KIO::Job *job )
00139 {
00140 ImapAccountBase* account = static_cast<KMFolderImap*>(mStorage)->account();
00141 ImapAccountBase::JobIterator it = account->findJob(job);
00142 if ( it == account->jobsEnd() )
00143 {
00144 emit renameDone( mNewName, false );
00145 deleteLater();
00146 return;
00147 }
00148 if ( job->error() )
00149 {
00150 account->handleJobError( job, i18n("Error while renaming a folder.") );
00151 emit renameDone( mNewName, false );
00152 deleteLater();
00153 return;
00154 }
00155 account->removeJob(it);
00156
00157 if ( mStorage->folderType() == KMFolderTypeImap )
00158 static_cast<KMFolderImap*>(mStorage)->setImapPath( mNewImapPath );
00159
00160 account->changeSubscription( false, mOldImapPath );
00161
00162 account->changeSubscription( true, mNewImapPath );
00163
00164
00165 mStorage->rename( mNewName );
00166
00167 emit renameDone( mNewName, true );
00168 deleteLater();
00169 }
00170
00171 void RenameJob::folderCopyComplete(bool success)
00172 {
00173 kdDebug(5006) << k_funcinfo << success << endl;
00174 if ( !success ) {
00175 kdWarning(5006) << k_funcinfo << "could not copy folder" << endl;
00176 emit renameDone( mNewName, false );
00177 deleteLater();
00178 return;
00179 }
00180 mNewFolder = mCopyFolderJob->targetFolder();
00181 mCopyFolderJob = 0;
00182
00183 if ( mStorageTempOpened ) {
00184 mStorageTempOpened->close("renamejob");
00185 mStorageTempOpened = 0;
00186 }
00187
00188 kdDebug(5006) << "deleting old folder" << endl;
00189
00190
00191 QString oldconfig = "Folder-" + mStorage->folder()->idString();
00192 KConfig* config = KMKernel::config();
00193 QMap<QString, QString> entries = config->entryMap( oldconfig );
00194 KConfigGroupSaver saver(config, "Folder-" + mNewFolder->idString());
00195 for ( QMap<QString, QString>::Iterator it = entries.begin();
00196 it != entries.end(); ++it )
00197 {
00198 if ( it.key() == "Id" || it.key() == "ImapPath" ||
00199 it.key() == "UidValidity" )
00200 continue;
00201 config->writeEntry( it.key(), it.data() );
00202 }
00203 mNewFolder->readConfig( config );
00204
00205 if ( mNewFolder->child() &&
00206 ( mNewFolder->storage()->hasChildren() == FolderStorage::HasNoChildren ) )
00207 mNewFolder->storage()->updateChildrenState();
00208
00209
00210 mStorage->blockSignals( false );
00211 if ( mStorage->folderType() == KMFolderTypeImap )
00212 {
00213 kmkernel->imapFolderMgr()->remove( mStorage->folder() );
00214 } else if ( mStorage->folderType() == KMFolderTypeCachedImap )
00215 {
00216
00217 KMAcctCachedImap* acct = static_cast<KMFolderCachedImap*>(mStorage)->account();
00218 if ( acct )
00219 acct->addDeletedFolder( mOldImapPath );
00220 kmkernel->dimapFolderMgr()->remove( mStorage->folder() );
00221 } else if ( mStorage->folderType() == KMFolderTypeSearch )
00222 {
00223
00224 kdWarning(5006) << k_funcinfo << "cannot remove a search folder" << endl;
00225 } else {
00226 kmkernel->folderMgr()->remove( mStorage->folder() );
00227 }
00228
00229 emit renameDone( mNewName, true );
00230 }
00231
00232 #include "renamejob.moc"