From f85b723f415debcf686ee39b2b2bf8c24203c358 Mon Sep 17 00:00:00 2001 From: Carsten Burghardt Date: Wed, 12 Nov 2003 21:15:13 +0000 Subject: [PATCH] Parts in encapsulated multipart messages were not found correctly. I rewrote this function because it was simply buggy and ugly. svn path=/trunk/kdepim/; revision=266685 --- kmcommands.cpp | 2 +- kmmessage.cpp | 68 +++++++++++++++++++------------------------------- kmmessage.h | 2 +- 3 files changed, 28 insertions(+), 44 deletions(-) diff --git a/kmcommands.cpp b/kmcommands.cpp index 96ffc4729..439d05173 100644 --- a/kmcommands.cpp +++ b/kmcommands.cpp @@ -1873,7 +1873,7 @@ void KMLoadPartsCommand::start() void KMLoadPartsCommand::slotPartRetrieved( KMMessage* msg, QString partSpecifier ) { - DwBodyPart* part = msg->findDwBodyPart( partSpecifier ); + DwBodyPart* part = msg->findDwBodyPart( msg->getFirstDwBodyPart(), partSpecifier ); if ( part ) { // update the DwBodyPart in the partNode diff --git a/kmmessage.cpp b/kmmessage.cpp index 36d340683..4bfa54c65 100644 --- a/kmmessage.cpp +++ b/kmmessage.cpp @@ -4033,51 +4033,35 @@ void KMMessage::getLink(int n, ulong *retMsgSerNum, KMMsgStatus *retStatus) cons } //----------------------------------------------------------------------------- -DwBodyPart* KMMessage::findDwBodyPart( const QString & partSpecifier ) +DwBodyPart* KMMessage::findDwBodyPart( DwBodyPart* part, const QString & partSpecifier ) { - DwBodyPart *part, *curpart; - QPtrList< DwBodyPart > parts; - - curpart = getFirstDwBodyPart(); - part = 0; - - while (curpart && !part) { - //dive into multipart messages - while ( curpart - && curpart->hasHeaders() - && curpart->Headers().HasContentType() - && curpart->Body().FirstBodyPart() - && (DwMime::kTypeMultipart == curpart->Headers().ContentType().Type()) ) - { - parts.append( curpart ); - curpart = curpart->Body().FirstBodyPart(); - } - if ( curpart->Body().Message() && - curpart->Body().Message()->Body().FirstBodyPart() ) - { - // dive into encapsulated message - parts.append( curpart->Body().Message()->Body().FirstBodyPart() ); - } + if ( !part ) return 0; + DwBodyPart* current; + kdDebug(5006) << "findDwBodyPart " << part->partId() << endl; - // this is where currPart->msgPart contains a leaf message part - if (curpart->partId() == partSpecifier) - part = curpart; - // go up in the tree until reaching a node with next - // (or the last top-level node) - while (curpart && !(curpart->Next()) && !(parts.isEmpty())) - { - curpart = parts.getLast(); - parts.removeLast(); - } - // re-check - if (curpart->partId() == partSpecifier) - part = curpart; + if ( part->partId() == partSpecifier ) + return part; + + // multipart + if ( part->hasHeaders() && + part->Headers().HasContentType() && + part->Body().FirstBodyPart() && + (DwMime::kTypeMultipart == part->Headers().ContentType().Type() ) && + (current = findDwBodyPart( part->Body().FirstBodyPart(), partSpecifier )) ) + { + return current; + } - if (curpart) { - curpart = curpart->Next(); - } + // encapsulated message + if ( part->Body().Message() && + part->Body().Message()->Body().FirstBodyPart() && + (current = findDwBodyPart( part->Body().Message()->Body().FirstBodyPart(), partSpecifier )) ) + { + return current; } - return part; + + // next part + return findDwBodyPart( part->Next(), partSpecifier ); } //----------------------------------------------------------------------------- @@ -4097,7 +4081,7 @@ void KMMessage::updateBodyPart(const QString partSpecifier, const QByteArray & d kdDebug(5006) << "KMMessage::updateBodyPart " << specifier << endl; // search for the bodypart - mLastUpdated = findDwBodyPart( specifier ); + mLastUpdated = findDwBodyPart( getFirstDwBodyPart(), specifier ); if (!mLastUpdated) { kdWarning(5006) << "KMMessage::updateBodyPart - can not find part " diff --git a/kmmessage.h b/kmmessage.h index 4b63a7815..ae3b524ed 100644 --- a/kmmessage.h +++ b/kmmessage.h @@ -565,7 +565,7 @@ public: /** Return the first DwBodyPart matching a given partSpecifier or zero, if no found. */ - DwBodyPart* findDwBodyPart( const QString & partSpecifier ); + DwBodyPart* findDwBodyPart( DwBodyPart* part, const QString & partSpecifier ); /** Get the DwBodyPart at position in aIdx. Indexing starts at 0. If there is no body part at that index, return value will be zero. */