diff --git a/kmcomposewin.cpp b/kmcomposewin.cpp index f0d2d381f..03aee9e27 100644 --- a/kmcomposewin.cpp +++ b/kmcomposewin.cpp @@ -1279,7 +1279,7 @@ void KMComposeWin::msgPartToItem(const KMMessagePart* msgPart, if (len > 9999) lenStr.sprintf("%uK", (len>>10)); else lenStr.sprintf("%u", len); - lvi->setText(0, msgPart->name()); + lvi->setText(0, msgPart->fileName()); lvi->setText(1, lenStr); lvi->setText(2, msgPart->contentTransferEncodingStr()); lvi->setText(3, msgPart->typeStr() + "/" + msgPart->subtypeStr()); diff --git a/kmmessage.cpp b/kmmessage.cpp index 37b40e166..30ac8d9b3 100644 --- a/kmmessage.cpp +++ b/kmmessage.cpp @@ -1695,9 +1695,14 @@ void KMMessage::bodyPart(int aIdx, KMMessagePart* aPart) const aPart->setSubtypeStr(headers->ContentType().SubtypeStr().c_str()); DwParameter *param=headers->ContentType().FirstParameter(); while(param) - if (param->Attribute()=="charset") break; - else param=param->Next(); - if (param) aPart->setCharset(param->Value().c_str()); + { + if (QString(param->Attribute().c_str())=="charset") + aPart->setCharset(param->Value().c_str()); + else if (QString(param->Attribute().c_str())=="name*") + aPart->setName(KMMsgBase::decodeRFC2231String( + param->Value().c_str())); + param=param->Next(); + } } else { @@ -1705,12 +1710,17 @@ void KMMessage::bodyPart(int aIdx, KMMessagePart* aPart) const aPart->setSubtypeStr("plain"); } // Modification by Markus - if (!headers->ContentType().Name().empty()) - aPart->setName(KMMsgBase::decodeQuotedPrintableString(headers->ContentType().Name().c_str()) ); - else if (!headers->Subject().AsString().empty()) - aPart->setName( KMMsgBase::decodeQuotedPrintableString(headers->Subject().AsString().c_str()) ); - else - aPart->setName( i18n("Attachment: ") + QString( "%1" ).arg( aIdx ) ); + if (aPart->name().isEmpty()) + { + if (!headers->ContentType().Name().empty()) + aPart->setName(KMMsgBase::decodeQuotedPrintableString(headers-> + ContentType().Name().c_str()) ); + else if (!headers->Subject().AsString().empty()) + aPart->setName( KMMsgBase::decodeQuotedPrintableString(headers-> + Subject().AsString().c_str()) ); + else + aPart->setName( i18n("Attachment: ") + QString( "%1" ).arg( aIdx ) ); + } // Content-transfer-encoding if (headers->HasContentTransferEncoding()) diff --git a/kmmsgbase.cpp b/kmmsgbase.cpp index 296d66847..3c61295f3 100644 --- a/kmmsgbase.cpp +++ b/kmmsgbase.cpp @@ -512,23 +512,33 @@ const QString KMMsgBase::decodeRFC2231String(const QString& _str) { int p = _str.find("'"); if (p < 0) return _str; - QString st = _str.mid(_str.findRev("'") + 1); + + QString charset = _str.left(p); + + QCString st = _str.mid(_str.findRev("'") + 1).ascii(); char ch, ch2; p = 0; while (p < (int)st.length()) { if (st.at(p) == 37) { - ch = st.at(p+1).latin1() - 48; + ch = st.at(p+1) - 48; if (ch > 16) ch -= 7; - ch2 = st.at(p+2).latin1() - 48; + ch2 = st.at(p+2) - 48; if (ch2 > 16) ch2 -= 7; st.at(p) = ch * 16 + ch2; st.remove( p+1, 2 ); } p++; } - return st; + QString result; + QTextCodec *codec = QTextCodec::codecForName(charset); + if (!codec) codec = QTextCodec::codecForName(KGlobal::locale() + ->charset()); + if (codec) result = codec->toUnicode(st); + else result = QString::fromLocal8Bit(st); + + return result; }