Better progress info for IMAP

svn path=/trunk/kdepim/; revision=284258
wilder-work
Carsten Burghardt 22 years ago
parent 44f91d506c
commit ab6cf67a5f
  1. 38
      imapjob.cpp
  2. 3
      imapjob.h
  3. 2
      kmfolderimap.cpp

@ -146,7 +146,7 @@ void ImapJob::init( JobType jt, QString sets, KMFolderImap* folder,
KMFolderImap *imapDestFolder = static_cast<KMFolderImap*>(msg_parent->storage());
url.setPath( imapDestFolder->imapPath() + ";UID=" + sets );
ImapAccountBase::jobData jd;
jd.parent = 0; mOffset = 0;
jd.parent = 0; jd.offset = 0;
jd.total = 1; jd.done = 0;
jd.msgList = msgList;
@ -231,6 +231,9 @@ void ImapJob::slotGetNextMessage()
}
KURL url = account->getUrl();
QString path = msgParent->imapPath() + ";UID=" + msg->headerField("X-UID");
ImapAccountBase::jobData jd;
jd.parent = 0; jd.offset = 0;
jd.total = 1; jd.done = 0;
if ( !mPartSpecifier.isEmpty() )
{
if ( mPartSpecifier.find ("STRUCTURE", 0, false) != -1 ) {
@ -239,15 +242,17 @@ void ImapJob::slotGetNextMessage()
path += ";SECTION=HEADER";
} else {
path += ";SECTION=BODY.PEEK[" + mPartSpecifier + "]";
DwBodyPart * part = msg->findDwBodyPart( msg->getFirstDwBodyPart(), mPartSpecifier );
if (part)
jd.total = part->BodySize();
}
} else {
path += ";SECTION=BODY.PEEK[]";
uint size = msg->headerField("X-Length").toUInt();
if (size > 0) jd.total = size;
}
url.setPath( path );
// kdDebug(5006) << "ImapJob::slotGetNextMessage - retrieve " << url.path() << endl;
ImapAccountBase::jobData jd;
jd.parent = 0;
jd.total = 1; jd.done = 0;
// protect the message, otherwise we'll get crashes afterwards
msg->setTransferInProgress( true );
KIO::SimpleJob *simpleJob = KIO::get( url, FALSE, FALSE );
@ -264,6 +269,11 @@ void ImapJob::slotGetNextMessage()
}
connect( mJob, SIGNAL(data(KIO::Job *, const QByteArray &)),
msgParent, SLOT(slotSimpleData(KIO::Job *, const QByteArray &)) );
if ( jd.total > 1 )
{
connect(mJob, SIGNAL(processedSize(KIO::Job *, KIO::filesize_t)),
this, SLOT(slotProcessedSize(KIO::Job *, KIO::filesize_t)));
}
}
@ -299,6 +309,8 @@ void ImapJob::slotGetMessageResult( KIO::Job * job )
mPartSpecifier == "HEADER" )
{
uint size = msg->headerField("X-Length").toUInt();
if ( size > 0 && mPartSpecifier.isEmpty() )
(*it).done = size;
QString uid = msg->headerField("X-UID");
msg->fromByteArray( (*it).data );
msg->setHeaderField("X-UID",uid);
@ -498,12 +510,10 @@ void ImapJob::slotPutMessageInfoData(KIO::Job *job, const QString &data)
if ( !(*it).msgList.isEmpty() )
{
const ulong * sernum = (ulong *)(*it).msgList.last()->getMsgSerNum();
// kdDebug(5006) << "insert sernum " << (*it).msgList.last()->getMsgSerNum() << " for " << uid << endl;
imapFolder->insertUidSerNumEntry(uid, sernum);
} else if (mMsgList.first())
{
const ulong * sernum = (ulong *)mMsgList.first()->getMsgSerNum();
// kdDebug(5006) << "insert sernum " << mMsgList.first()->getMsgSerNum() << " for " << uid << endl;
imapFolder->insertUidSerNumEntry(uid, sernum);
}
}
@ -550,6 +560,22 @@ void ImapJob::expireMessages()
return;
}
//-----------------------------------------------------------------------------
void ImapJob::slotProcessedSize(KIO::Job * job, KIO::filesize_t processed)
{
KMMessage *msg = mMsgList.first();
if (!msg || !msg->parent() || !job) {
return;
}
KMFolderImap* parent = static_cast<KMFolderImap*>(msg->parent()->storage());
KMAcctImap *account = parent->account();
if ( !account ) return;
ImapAccountBase::JobIterator it = account->findJob( job );
if ( it == account->jobsEnd() ) return;
(*it).done = processed;
emit progress( (*it).done, (*it).total );
}
}//namespace KMail
#include "imapjob.moc"

@ -71,6 +71,8 @@ private slots:
/** result of a copy-operation */
void slotCopyMessageResult( KIO::Job *job );
void slotCopyMessageInfoData( KIO::Job *, const QString &data );
void slotProcessedSize( KIO::Job *, KIO::filesize_t processed );
private:
void execute();
void expireMessages();
@ -78,7 +80,6 @@ private:
QPtrList<KMMessage>& msgList );
KIO::Job *mJob;
QByteArray mData;
int mTotal, mDone, mOffset;
const AttachmentStrategy *mAttachmentStrategy;
};

@ -1069,6 +1069,8 @@ KMFolderImap::doCreateJob( KMMessage *msg, FolderJob::JobType jt,
partSpecifier = QString::null;
ImapJob *job = new ImapJob( msg, jt, kmfi, partSpecifier );
connect( job, SIGNAL( progress(unsigned long, unsigned long) ),
mAccount, SLOT( displayProgress() ) );
return job;
}
}

Loading…
Cancel
Save