Choose between base64 and qp also based on CharFreq::printableRatio()

svn path=/trunk/kdenetwork/kmail/; revision=131617
wilder-work
Marc Mutz 25 years ago
parent 1b4e4ac30f
commit 904b6ca4fa
  1. 48
      kmmsgpart.cpp

@ -118,19 +118,35 @@ void KMMessagePart::setBodyAndGuessCte(const QByteArray& aBuf,
if ( allow8Bit )
allowedCte << DwMime::kCte8bit;
case CharFreq::SevenBitData:
allowedCte << DwMime::kCteQp;
allowedCte << DwMime::kCteBase64;
if ( cf.printableRatio() > 5.0/6.0 ) {
// let n the length of data and p the number of printable chars.
// Then base64 \approx 4n/3; qp \approx p + 3(n-p)
// => qp < base64 iff p > 5n/6.
allowedCte << DwMime::kCteQp;
allowedCte << DwMime::kCteBase64;
} else {
allowedCte << DwMime::kCteBase64;
allowedCte << DwMime::kCteQp;
}
break;
case CharFreq::EightBitText:
if ( allow8Bit )
allowedCte << DwMime::kCte8bit;
allowedCte << DwMime::kCteQp;
if ( cf.printableRatio() > 5.0/6.0 ) {
allowedCte << DwMime::kCteQp;
allowedCte << DwMime::kCteBase64;
} else {
allowedCte << DwMime::kCteBase64;
allowedCte << DwMime::kCteQp;
}
break;
case CharFreq::EightBitData:
allowedCte << DwMime::kCteBase64;
break;
}
kdDebug() << "CharFreq returned " << cf.type() << " and I chose "
kdDebug() << "CharFreq returned " << cf.type() << "/"
<< cf.printableRatio() << " and I chose "
<< allowedCte[0] << endl;
setCte( allowedCte[0] ); // choose best fitting
setBodyEncodedBinary( aBuf );
@ -152,18 +168,36 @@ void KMMessagePart::setBodyAndGuessCte(const QCString& aBuf,
if ( allow8Bit )
allowedCte << DwMime::kCte8bit;
case CharFreq::SevenBitData:
allowedCte << DwMime::kCteQp;
allowedCte << DwMime::kCteBase64;
if ( cf.printableRatio() > 5.0/6.0 ) {
// let n the length of data and p the number of printable chars.
// Then base64 \approx 4n/3; qp \approx p + 3(n-p)
// => qp < base64 iff p > 5n/6.
allowedCte << DwMime::kCteQp;
allowedCte << DwMime::kCteBase64;
} else {
allowedCte << DwMime::kCteBase64;
allowedCte << DwMime::kCteQp;
}
break;
case CharFreq::EightBitText:
if ( allow8Bit )
allowedCte << DwMime::kCte8bit;
allowedCte << DwMime::kCteQp;
if ( cf.printableRatio() > 5.0/6.0 ) {
allowedCte << DwMime::kCteQp;
allowedCte << DwMime::kCteBase64;
} else {
allowedCte << DwMime::kCteBase64;
allowedCte << DwMime::kCteQp;
}
break;
case CharFreq::EightBitData:
allowedCte << DwMime::kCteBase64;
break;
}
kdDebug() << "CharFreq returned " << cf.type() << "/"
<< cf.printableRatio() << " and I chose "
<< allowedCte[0] << endl;
setCte( allowedCte[0] ); // choose best fitting
setBodyEncoded( aBuf );
}

Loading…
Cancel
Save