From 0edd99a2613e7a1402ee459233fb9354cffd1eb2 Mon Sep 17 00:00:00 2001 From: Ingo Klcker Date: Sat, 27 Apr 2002 19:49:57 +0000 Subject: [PATCH] Fix Bug#38809: attachments lost using filters for forwarding. As this fix duplicates some code it should be considered a workaround and not a proper fix. svn path=/trunk/kdenetwork/kmail/; revision=152317 --- kmfilteraction.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/kmfilteraction.cpp b/kmfilteraction.cpp index 734d9dd38..5e85156bc 100644 --- a/kmfilteraction.cpp +++ b/kmfilteraction.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -1181,12 +1182,70 @@ KMFilterActionForward::KMFilterActionForward() KMFilterAction::ReturnCode KMFilterActionForward::process(KMMessage* aMsg) const { - KMMessage* msg; if ( mParameter.isEmpty() ) return ErrorButGoOn; - msg = aMsg->createForward(); + // Create the forwarded message by hand to make forwarding of messages with + // attachments work. + // Note: This duplicates a lot of code from KMMessage::createForward() and + // KMComposeWin::applyChanges(). + // ### FIXME: Remove the code duplication again. + + KMMessage* msg = new KMMessage; + + msg->initFromMessage( aMsg ); + + QString st = QString::fromUtf8( aMsg->createForwardBody() ); + QCString + encoding = KMMsgBase::autoDetectCharset( aMsg->charset(), + KMMessage::preferredCharsets(), + st ); + if( encoding.isEmpty() ) + encoding = "utf-8"; + QCString str = KMMsgBase::codecForName( encoding )->fromUnicode( st ); + + msg->setCharset( encoding ); msg->setTo( mParameter ); + msg->setSubject( "Fwd: " + aMsg->subject() ); + + bool isQP = kernel->msgSender()->sendQuotedPrintable(); + + if( aMsg->numBodyParts() == 0 ) + { + msg->setAutomaticFields( true ); + msg->setHeaderField( "Content-Type", "text/plain" ); + msg->setCteStr( isQP ? "quoted-printable": "8bit" ); + msg->setCharset( encoding ); + if( isQP ) + msg->setBodyEncoded( str ); + else + msg->setBody( str ); + } + else + { + KMMessagePart bodyPart, msgPart; + + msg->removeHeaderField( "Content-Type" ); + msg->removeHeaderField( "Content-Transfer-Encoding" ); + msg->setAutomaticFields( true ); + msg->setBody( "This message is in MIME format.\n\n" ); + + bodyPart.setTypeStr( "text" ); + bodyPart.setSubtypeStr( "plain" ); + bodyPart.setCteStr( isQP ? "quoted-printable": "8bit" ); + bodyPart.setCharset( encoding ); + bodyPart.setBodyEncoded( str ); + msg->addBodyPart( &bodyPart ); + + for( int i = 0; i < aMsg->numBodyParts(); i++ ) + { + aMsg->bodyPart( i, &msgPart ); + if( i > 0 || qstricmp( msgPart.typeStr(), "text" ) != 0 ) + msg->addBodyPart( &msgPart ); + } + } + msg->cleanupHeader(); + msg->link( aMsg, KMMsgStatusForwarded ); if ( !kernel->msgSender()->send(msg) ) { kdDebug(5006) << "KMFilterAction: could not forward message (sending failed)" << endl;