Non-latin characters in attachment file names Part II

Decoding should now work also.

svn path=/trunk/kdenetwork/kmail/; revision=72672
wilder-work
Michael Haeckel 26 years ago
parent c8087b6898
commit 30abaf3784
  1. 2
      kmcomposewin.cpp
  2. 28
      kmmessage.cpp
  3. 18
      kmmsgbase.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());

@ -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())

@ -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;
}

Loading…
Cancel
Save