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
00030
00031
00032 #ifdef HAVE_CONFIG_H
00033 #include <config.h>
00034 #endif
00035
00036 #include "imapjob.h"
00037 #include "kmfolderimap.h"
00038 #include "kmfolder.h"
00039 #include "kmmsgpart.h"
00040 #include "progressmanager.h"
00041 using KPIM::ProgressManager;
00042 #include "util.h"
00043
00044 #include <qstylesheet.h>
00045 #include <kio/scheduler.h>
00046 #include <kdebug.h>
00047 #include <klocale.h>
00048 #include <mimelib/body.h>
00049 #include <mimelib/bodypart.h>
00050 #include <mimelib/string.h>
00051
00052
00053 namespace KMail {
00054
00055
00056 ImapJob::ImapJob( KMMessage *msg, JobType jt, KMFolderImap* folder,
00057 QString partSpecifier, const AttachmentStrategy *as )
00058 : FolderJob( msg, jt, folder? folder->folder() : 0, partSpecifier ),
00059 mAttachmentStrategy( as ), mParentProgressItem(0)
00060 {
00061 }
00062
00063
00064 ImapJob::ImapJob( QPtrList<KMMessage>& msgList, QString sets, JobType jt,
00065 KMFolderImap* folder )
00066 : FolderJob( msgList, sets, jt, folder? folder->folder() : 0 ),
00067 mAttachmentStrategy ( 0 ), mParentProgressItem(0)
00068 {
00069 }
00070
00071 void ImapJob::init( JobType jt, QString sets, KMFolderImap* folder,
00072 QPtrList<KMMessage>& msgList )
00073 {
00074 mJob = 0;
00075
00076 assert(jt == tGetMessage || folder);
00077 KMMessage* msg = msgList.first();
00078
00079 if ( !msg ) {
00080 deleteLater();
00081 return;
00082 }
00083 mType = jt;
00084 mDestFolder = folder? folder->folder() : 0;
00085
00086 if (folder) {
00087 folder->open("imapjobdest");
00088 }
00089 KMFolder *msg_parent = msg->parent();
00090 if (msg_parent) {
00091 if (!folder || folder!= msg_parent->storage()) {
00092 msg_parent->open("imapjobsrc");
00093 }
00094 }
00095 mSrcFolder = msg_parent;
00096
00097
00098
00099
00100 KMAcctImap *account = 0;
00101 if (folder) {
00102 account = folder->account();
00103 } else {
00104 if ( msg_parent && msg_parent->storage() )
00105 account = static_cast<KMFolderImap*>(msg_parent->storage())->account();
00106 }
00107 if ( !account ||
00108 account->makeConnection() == ImapAccountBase::Error ) {
00109 deleteLater();
00110 return;
00111 }
00112 account->mJobList.append( this );
00113 if ( jt == tPutMessage )
00114 {
00115
00116 QPtrListIterator<KMMessage> it( msgList );
00117 KMMessage* curMsg;
00118 while ( ( curMsg = it.current() ) != 0 )
00119 {
00120 ++it;
00121 if ( mSrcFolder && !curMsg->isMessage() )
00122 {
00123 int idx = mSrcFolder->find( curMsg );
00124 curMsg = mSrcFolder->getMsg( idx );
00125 }
00126 KURL url = account->getUrl();
00127 QString flags = KMFolderImap::statusToFlags( curMsg->status() );
00128 url.setPath( folder->imapPath() + ";SECTION=" + flags );
00129 ImapAccountBase::jobData jd;
00130 jd.parent = 0; jd.offset = 0; jd.done = 0;
00131 jd.total = ( curMsg->msgSizeServer() > 0 ) ?
00132 curMsg->msgSizeServer() : curMsg->msgSize();
00133 jd.msgList.append( curMsg );
00134 QCString cstr( curMsg->asString() );
00135 int a = cstr.find("\nX-UID: ");
00136 int b = cstr.find('\n', a);
00137 if (a != -1 && b != -1 && cstr.find("\n\n") > a) cstr.remove(a, b-a);
00138 jd.data.resize( cstr.length() + cstr.contains( "\n" ) - cstr.contains( "\r\n" ) );
00139 unsigned int i = 0;
00140 char prevChar = '\0';
00141
00142 for ( char *ch = cstr.data(); *ch; ch++ )
00143 {
00144 if ( *ch == '\n' && (prevChar != '\r') ) {
00145 jd.data.at( i ) = '\r';
00146 i++;
00147 }
00148 jd.data.at( i ) = *ch;
00149 prevChar = *ch;
00150 i++;
00151 }
00152 jd.progressItem = ProgressManager::createProgressItem(
00153 mParentProgressItem,
00154 "ImapJobUploading"+ProgressManager::getUniqueID(),
00155 i18n("Uploading message data"),
00156 QStyleSheet::escape( curMsg->subject() ),
00157 true,
00158 account->useSSL() || account->useTLS() );
00159 jd.progressItem->setTotalItems( jd.total );
00160 connect ( jd.progressItem, SIGNAL( progressItemCanceled( KPIM::ProgressItem*)),
00161 account, SLOT( slotAbortRequested( KPIM::ProgressItem* ) ) );
00162 KIO::SimpleJob *job = KIO::put( url, 0, FALSE, FALSE, FALSE );
00163 KIO::Scheduler::assignJobToSlave( account->slave(), job );
00164 account->insertJob( job, jd );
00165 connect( job, SIGNAL(result(KIO::Job *)),
00166 SLOT(slotPutMessageResult(KIO::Job *)) );
00167 connect( job, SIGNAL(dataReq(KIO::Job *, QByteArray &)),
00168 SLOT(slotPutMessageDataReq(KIO::Job *, QByteArray &)) );
00169 connect( job, SIGNAL(infoMessage(KIO::Job *, const QString &)),
00170 SLOT(slotPutMessageInfoData(KIO::Job *, const QString &)) );
00171 connect( job, SIGNAL(processedSize(KIO::Job *, KIO::filesize_t)),
00172 SLOT(slotProcessedSize(KIO::Job *, KIO::filesize_t)));
00173 }
00174 }
00175 else if ( jt == tCopyMessage || jt == tMoveMessage )
00176 {
00177 KURL url = account->getUrl();
00178 KURL destUrl = account->getUrl();
00179 destUrl.setPath(folder->imapPath());
00180 KMFolderImap *imapDestFolder = static_cast<KMFolderImap*>(msg_parent->storage());
00181 url.setPath( imapDestFolder->imapPath() + ";UID=" + sets );
00182 ImapAccountBase::jobData jd;
00183 jd.parent = 0; jd.offset = 0;
00184 jd.total = 1; jd.done = 0;
00185 jd.msgList = msgList;
00186
00187 QByteArray packedArgs;
00188 QDataStream stream( packedArgs, IO_WriteOnly );
00189
00190 stream << (int) 'C' << url << destUrl;
00191 jd.progressItem = ProgressManager::createProgressItem(
00192 mParentProgressItem,
00193 "ImapJobCopyMove"+ProgressManager::getUniqueID(),
00194 i18n("Server operation"),
00195 i18n("Source folder: %1 - Destination folder: %2")
00196 .arg( QStyleSheet::escape( msg_parent->prettyURL() ),
00197 QStyleSheet::escape( mDestFolder->prettyURL() ) ),
00198 true,
00199 account->useSSL() || account->useTLS() );
00200 jd.progressItem->setTotalItems( jd.total );
00201 connect ( jd.progressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem*)),
00202 account, SLOT( slotAbortRequested(KPIM::ProgressItem* ) ) );
00203 KIO::SimpleJob *simpleJob = KIO::special( url, packedArgs, FALSE );
00204 KIO::Scheduler::assignJobToSlave( account->slave(), simpleJob );
00205 mJob = simpleJob;
00206 account->insertJob( mJob, jd );
00207 connect( mJob, SIGNAL(result(KIO::Job *)),
00208 SLOT(slotCopyMessageResult(KIO::Job *)) );
00209 if ( jt == tMoveMessage )
00210 {
00211 connect( mJob, SIGNAL(infoMessage(KIO::Job *, const QString &)),
00212 SLOT(slotCopyMessageInfoData(KIO::Job *, const QString &)) );
00213 }
00214 }
00215 else {
00216 slotGetNextMessage();
00217 }
00218 }
00219
00220
00221
00222 ImapJob::~ImapJob()
00223 {
00224 if ( mDestFolder )
00225 {
00226 KMAcctImap *account = static_cast<KMFolderImap*>(mDestFolder->storage())->account();
00227 if ( account ) {
00228 if ( mJob ) {
00229 ImapAccountBase::JobIterator it = account->findJob( mJob );
00230 if ( it != account->jobsEnd() ) {
00231 if( (*it).progressItem ) {
00232 (*it).progressItem->setComplete();
00233 (*it).progressItem = 0;
00234 }
00235 if ( !(*it).msgList.isEmpty() ) {
00236 for ( QPtrListIterator<KMMessage> mit( (*it).msgList ); mit.current(); ++mit )
00237 mit.current()->setTransferInProgress( false );
00238 }
00239 }
00240 account->removeJob( mJob );
00241 }
00242 account->mJobList.remove( this );
00243 }
00244 mDestFolder->close("imapjobdest");
00245 }
00246
00247 if ( mSrcFolder ) {
00248 if (!mDestFolder || mDestFolder != mSrcFolder) {
00249 if (! (mSrcFolder->folderType() == KMFolderTypeImap) ) return;
00250 KMAcctImap *account = static_cast<KMFolderImap*>(mSrcFolder->storage())->account();
00251 if ( account ) {
00252 if ( mJob ) {
00253 ImapAccountBase::JobIterator it = account->findJob( mJob );
00254 if ( it != account->jobsEnd() ) {
00255 if( (*it).progressItem ) {
00256 (*it).progressItem->setComplete();
00257 (*it).progressItem = 0;
00258 }
00259 if ( !(*it).msgList.isEmpty() ) {
00260 for ( QPtrListIterator<KMMessage> mit( (*it).msgList ); mit.current(); ++mit )
00261 mit.current()->setTransferInProgress( false );
00262 }
00263 }
00264 account->removeJob( mJob );
00265 }
00266 account->mJobList.remove( this );
00267 }
00268 }
00269 mSrcFolder->close("imapjobsrc");
00270 }
00271 }
00272
00273
00274
00275 void ImapJob::slotGetNextMessage()
00276 {
00277 KMMessage *msg = mMsgList.first();
00278 KMFolderImap *msgParent = msg ? static_cast<KMFolderImap*>(msg->storage()) : 0;
00279 if ( !msgParent || !msg || msg->UID() == 0 )
00280 {
00281
00282 emit messageRetrieved( 0 );
00283 deleteLater();
00284 return;
00285 }
00286 KMAcctImap *account = msgParent->account();
00287 KURL url = account->getUrl();
00288 QString path = msgParent->imapPath() + ";UID=" + QString::number(msg->UID());
00289 ImapAccountBase::jobData jd;
00290 jd.parent = 0; jd.offset = 0;
00291 jd.total = 1; jd.done = 0;
00292 jd.msgList.append( msg );
00293 if ( !mPartSpecifier.isEmpty() )
00294 {
00295 if ( mPartSpecifier.find ("STRUCTURE", 0, false) != -1 ) {
00296 path += ";SECTION=STRUCTURE";
00297 } else if ( mPartSpecifier == "HEADER" ) {
00298 path += ";SECTION=HEADER";
00299 } else {
00300 path += ";SECTION=BODY.PEEK[" + mPartSpecifier + "]";
00301 DwBodyPart * part = msg->findDwBodyPart( msg->getFirstDwBodyPart(), mPartSpecifier );
00302 if (part)
00303 jd.total = part->BodySize();
00304 }
00305 } else {
00306 path += ";SECTION=BODY.PEEK[]";
00307 if (msg->msgSizeServer() > 0)
00308 jd.total = msg->msgSizeServer();
00309 }
00310 url.setPath( path );
00311
00312
00313 msg->setTransferInProgress( true );
00314 jd.progressItem = ProgressManager::createProgressItem(
00315 mParentProgressItem,
00316 "ImapJobDownloading"+ProgressManager::getUniqueID(),
00317 i18n("Downloading message data"),
00318 i18n("Message with subject: ") +
00319 QStyleSheet::escape( msg->subject() ),
00320 true,
00321 account->useSSL() || account->useTLS() );
00322 connect ( jd.progressItem, SIGNAL( progressItemCanceled( KPIM::ProgressItem*)),
00323 account, SLOT( slotAbortRequested( KPIM::ProgressItem* ) ) );
00324 jd.progressItem->setTotalItems( jd.total );
00325
00326 KIO::SimpleJob *simpleJob = KIO::get( url, FALSE, FALSE );
00327 KIO::Scheduler::assignJobToSlave( account->slave(), simpleJob );
00328 mJob = simpleJob;
00329 account->insertJob( mJob, jd );
00330 if ( mPartSpecifier.find( "STRUCTURE", 0, false ) != -1 )
00331 {
00332 connect( mJob, SIGNAL(result(KIO::Job *)),
00333 this, SLOT(slotGetBodyStructureResult(KIO::Job *)) );
00334 } else {
00335 connect( mJob, SIGNAL(result(KIO::Job *)),
00336 this, SLOT(slotGetMessageResult(KIO::Job *)) );
00337 }
00338 connect( mJob, SIGNAL(data(KIO::Job *, const QByteArray &)),
00339 msgParent, SLOT(slotSimpleData(KIO::Job *, const QByteArray &)) );
00340 if ( jd.total > 1 )
00341 {
00342 connect(mJob, SIGNAL(processedSize(KIO::Job *, KIO::filesize_t)),
00343 this, SLOT(slotProcessedSize(KIO::Job *, KIO::filesize_t)));
00344 }
00345 }
00346
00347
00348
00349 void ImapJob::slotGetMessageResult( KIO::Job * job )
00350 {
00351 KMMessage *msg = mMsgList.first();
00352 if (!msg || !msg->parent() || !job) {
00353 emit messageRetrieved( 0 );
00354 deleteLater();
00355 return;
00356 }
00357 KMFolderImap* parent = static_cast<KMFolderImap*>(msg->storage());
00358 if (msg->transferInProgress())
00359 msg->setTransferInProgress( false );
00360 KMAcctImap *account = parent->account();
00361 if ( !account ) {
00362 emit messageRetrieved( 0 );
00363 deleteLater();
00364 return;
00365 }
00366 ImapAccountBase::JobIterator it = account->findJob( job );
00367 if ( it == account->jobsEnd() ) return;
00368
00369 bool gotData = true;
00370 if (job->error())
00371 {
00372 QString errorStr = i18n( "Error while retrieving messages from the server." );
00373 if ( (*it).progressItem )
00374 (*it).progressItem->setStatus( errorStr );
00375 account->handleJobError( job, errorStr );
00376 return;
00377 } else {
00378 if ((*it).data.size() > 0)
00379 {
00380 kdDebug(5006) << "ImapJob::slotGetMessageResult - retrieved part " << mPartSpecifier << endl;
00381 if ( mPartSpecifier.isEmpty() ||
00382 mPartSpecifier == "HEADER" )
00383 {
00384 uint size = msg->msgSizeServer();
00385 if ( size > 0 && mPartSpecifier.isEmpty() )
00386 (*it).done = size;
00387 ulong uid = msg->UID();
00388
00389 if ( mPartSpecifier.isEmpty() )
00390 msg->setComplete( true );
00391 else
00392 msg->setReadyToShow( false );
00393
00394
00395 size_t dataSize = (*it).data.size();
00396 dataSize = Util::crlf2lf( (*it).data.data(), dataSize );
00397 (*it).data.resize( dataSize );
00398
00399
00400
00401
00402 msg->parent()->storage()->blockSignals( true );
00403 msg->fromByteArray( (*it).data );
00404
00405 msg->parent()->storage()->blockSignals( false );
00406 if ( size > 0 && msg->msgSizeServer() == 0 ) {
00407 msg->setMsgSizeServer(size);
00408 }
00409
00410 msg->setUID(uid);
00411
00412 } else {
00413
00414 size_t dataSize = (*it).data.size();
00415 dataSize = Util::crlf2lf( (*it).data.data(), dataSize );
00416 (*it).data.resize( dataSize );
00417
00418
00419 msg->updateBodyPart( mPartSpecifier, (*it).data );
00420 msg->setReadyToShow( true );
00421
00422
00423 if (msg->attachmentState() != KMMsgHasAttachment)
00424 msg->updateAttachmentState();
00425 }
00426 } else {
00427 kdDebug(5006) << "ImapJob::slotGetMessageResult - got no data for " << mPartSpecifier << endl;
00428 gotData = false;
00429 msg->setReadyToShow( true );
00430
00431 msg->notify();
00432 }
00433 }
00434 if (account->slave()) {
00435 account->removeJob(it);
00436 account->mJobList.remove(this);
00437 }
00438
00439
00440 if ( mPartSpecifier.isEmpty() ||
00441 mPartSpecifier == "HEADER" )
00442 {
00443 if ( gotData )
00444 emit messageRetrieved(msg);
00445 else
00446 {
00447
00448
00449 emit messageRetrieved( 0 );
00450 parent->ignoreJobsForMessage( msg );
00451 int idx = parent->find( msg );
00452 if (idx != -1) parent->removeMsg( idx, true );
00453
00454
00455 return;
00456 }
00457 } else {
00458 emit messageUpdated(msg, mPartSpecifier);
00459 }
00460 deleteLater();
00461 }
00462
00463
00464 void ImapJob::slotGetBodyStructureResult( KIO::Job * job )
00465 {
00466 KMMessage *msg = mMsgList.first();
00467 if (!msg || !msg->parent() || !job) {
00468 deleteLater();
00469 return;
00470 }
00471 KMFolderImap* parent = static_cast<KMFolderImap*>(msg->storage());
00472 if (msg->transferInProgress())
00473 msg->setTransferInProgress( false );
00474 KMAcctImap *account = parent->account();
00475 if ( !account ) {
00476 deleteLater();
00477 return;
00478 }
00479 ImapAccountBase::JobIterator it = account->findJob( job );
00480 if ( it == account->jobsEnd() ) return;
00481
00482
00483 if (job->error())
00484 {
00485 account->handleJobError( job, i18n( "Error while retrieving information on the structure of a message." ) );
00486 return;
00487 } else {
00488 if ((*it).data.size() > 0)
00489 {
00490 QDataStream stream( (*it).data, IO_ReadOnly );
00491 account->handleBodyStructure(stream, msg, mAttachmentStrategy);
00492 }
00493 }
00494 if (account->slave()) {
00495 account->removeJob(it);
00496 account->mJobList.remove(this);
00497 }
00498 deleteLater();
00499 }
00500
00501
00502 void ImapJob::slotPutMessageDataReq( KIO::Job *job, QByteArray &data )
00503 {
00504 KMAcctImap *account = static_cast<KMFolderImap*>(mDestFolder->storage())->account();
00505 if ( !account )
00506 {
00507 emit finished();
00508 deleteLater();
00509 return;
00510 }
00511 ImapAccountBase::JobIterator it = account->findJob( job );
00512 if ( it == account->jobsEnd() ) return;
00513
00514 if ((*it).data.size() - (*it).offset > 0x8000)
00515 {
00516 data.duplicate((*it).data.data() + (*it).offset, 0x8000);
00517 (*it).offset += 0x8000;
00518 }
00519 else if ((*it).data.size() - (*it).offset > 0)
00520 {
00521 data.duplicate((*it).data.data() + (*it).offset, (*it).data.size() - (*it).offset);
00522 (*it).offset = (*it).data.size();
00523 } else data.resize(0);
00524 }
00525
00526
00527
00528 void ImapJob::slotPutMessageResult( KIO::Job *job )
00529 {
00530 KMAcctImap *account = static_cast<KMFolderImap*>(mDestFolder->storage())->account();
00531 if ( !account )
00532 {
00533 emit finished();
00534 deleteLater();
00535 return;
00536 }
00537 ImapAccountBase::JobIterator it = account->findJob( job );
00538 if ( it == account->jobsEnd() ) return;
00539 bool deleteMe = false;
00540 if (job->error())
00541 {
00542 if ( (*it).progressItem )
00543 (*it).progressItem->setStatus( i18n("Uploading message data failed.") );
00544 account->handlePutError( job, *it, mDestFolder );
00545 return;
00546 } else {
00547 if ( (*it).progressItem )
00548 (*it).progressItem->setStatus( i18n("Uploading message data completed.") );
00549 if ( mParentProgressItem )
00550 {
00551 mParentProgressItem->incCompletedItems();
00552 mParentProgressItem->updateProgress();
00553 }
00554 KMMessage *msg = (*it).msgList.first();
00555 emit messageStored( msg );
00556 if ( msg == mMsgList.getLast() )
00557 {
00558 emit messageCopied( mMsgList );
00559 if (account->slave()) {
00560 account->mJobList.remove( this );
00561 }
00562 deleteMe = true;
00563 }
00564 }
00565 if (account->slave()) {
00566 account->removeJob( it );
00567 }
00568 if ( deleteMe )
00569 deleteLater();
00570 }
00571
00572
00573 void ImapJob::slotCopyMessageInfoData(KIO::Job * job, const QString & data)
00574 {
00575 KMFolderImap * imapFolder = static_cast<KMFolderImap*>(mDestFolder->storage());
00576 KMAcctImap *account = imapFolder->account();
00577 if ( !account )
00578 {
00579 emit finished();
00580 deleteLater();
00581 return;
00582 }
00583 ImapAccountBase::JobIterator it = account->findJob( job );
00584 if ( it == account->jobsEnd() ) return;
00585
00586 if (data.find("UID") != -1)
00587 {
00588
00589 QString oldUid = data.section(' ', 1, 1);
00590 QString newUid = data.section(' ', 2, 2);
00591
00592
00593 QValueList<ulong> olduids = KMFolderImap::splitSets(oldUid);
00594 QValueList<ulong> newuids = KMFolderImap::splitSets(newUid);
00595
00596 int index = -1;
00597 KMMessage * msg;
00598 for ( msg = (*it).msgList.first(); msg; msg = (*it).msgList.next() )
00599 {
00600 ulong uid = msg->UID();
00601 index = olduids.findIndex(uid);
00602 if (index > -1)
00603 {
00604
00605 imapFolder->saveMsgMetaData( msg, newuids[index] );
00606 }
00607 }
00608 }
00609 }
00610
00611
00612 void ImapJob::slotPutMessageInfoData(KIO::Job *job, const QString &data)
00613 {
00614 KMFolderImap * imapFolder = static_cast<KMFolderImap*>(mDestFolder->storage());
00615 KMAcctImap *account = imapFolder->account();
00616 if ( !account )
00617 {
00618 emit finished();
00619 deleteLater();
00620 return;
00621 }
00622 ImapAccountBase::JobIterator it = account->findJob( job );
00623 if ( it == account->jobsEnd() ) return;
00624
00625 if ( data.find("UID") != -1 )
00626 {
00627 ulong uid = ( data.right(data.length()-4) ).toInt();
00628 if ( !(*it).msgList.isEmpty() )
00629 {
00630 imapFolder->saveMsgMetaData( (*it).msgList.first(), uid );
00631 }
00632 }
00633 }
00634
00635
00636
00637 void ImapJob::slotCopyMessageResult( KIO::Job *job )
00638 {
00639 KMAcctImap *account = static_cast<KMFolderImap*>(mDestFolder->storage())->account();
00640 if ( !account )
00641 {
00642 emit finished();
00643 deleteLater();
00644 return;
00645 }
00646 ImapAccountBase::JobIterator it = account->findJob( job );
00647 if ( it == account->jobsEnd() ) return;
00648
00649 if (job->error())
00650 {
00651 mErrorCode = job->error();
00652 QString errStr = i18n("Error while copying messages.");
00653 if ( (*it).progressItem )
00654 (*it).progressItem->setStatus( errStr );
00655 account->handleJobError( job, errStr );
00656 deleteLater();
00657 return;
00658 } else {
00659 if ( !(*it).msgList.isEmpty() )
00660 {
00661 emit messageCopied((*it).msgList);
00662 } else if (mMsgList.first()) {
00663 emit messageCopied(mMsgList.first());
00664 }
00665 }
00666 if (account->slave()) {
00667 account->removeJob(it);
00668 account->mJobList.remove(this);
00669 }
00670 deleteLater();
00671 }
00672
00673
00674 void ImapJob::execute()
00675 {
00676 init( mType, mSets, mDestFolder?
00677 dynamic_cast<KMFolderImap*>( mDestFolder->storage() ):0, mMsgList );
00678 }
00679
00680
00681 void ImapJob::setParentFolder( const KMFolderImap* parent )
00682 {
00683 mParentFolder = const_cast<KMFolderImap*>( parent );
00684 }
00685
00686
00687 void ImapJob::slotProcessedSize(KIO::Job * job, KIO::filesize_t processed)
00688 {
00689 KMMessage *msg = mMsgList.first();
00690 if (!msg || !job) {
00691 return;
00692 }
00693 KMFolderImap* parent = 0;
00694 if ( msg->parent() && msg->parent()->folderType() == KMFolderTypeImap )
00695 parent = static_cast<KMFolderImap*>(msg->parent()->storage());
00696 else if (mDestFolder)
00697 parent = static_cast<KMFolderImap*>(mDestFolder->storage());
00698 if (!parent) return;
00699 KMAcctImap *account = parent->account();
00700 if ( !account ) return;
00701 ImapAccountBase::JobIterator it = account->findJob( job );
00702 if ( it == account->jobsEnd() ) return;
00703 (*it).done = processed;
00704 if ( (*it).progressItem ) {
00705 (*it).progressItem->setCompletedItems( processed );
00706 (*it).progressItem->updateProgress();
00707 }
00708 emit progress( (*it).done, (*it).total );
00709 }
00710
00711 }
00712
00713 #include "imapjob.moc"