From 72c008ef4e2ef401da71010dd96342a08a2af106 Mon Sep 17 00:00:00 2001 From: Thomas McGuire Date: Sun, 12 Oct 2008 15:34:53 +0000 Subject: [PATCH] Merged revisions 870426 via svnmerge from svn+ssh://tmcguire@svn.kde.org/home/kde/branches/KDE/4.1/kdepim ........ r870426 | tmcguire | 2008-10-12 16:23:56 +0200 (Sun, 12 Oct 2008) | 17 lines Backport r867007 by tmcguire from trunk to the 4.1 branch: Fix the charset name being "ISO 8859-xx" instead of "ISO-8859-xx". This is because KCharsets::encodingForName() prefers to return something "human-readable" now, thank you very much. I wonder why this worked in 3.5, the hypen seems to be missing there as well. The KCharsets code is too much magic to be understandable unfortunatley. Apparently KMail has been sending invalid messages ever since 4.1 was released. Urgh :( I hope I didn't mix human- and machine-readable names anywhere, otherwise things will break. This is also the reason I was too afraid to change this in kdelibs. CCBUG: 171947 ........ svn path=/branches/kdepim/enterprise4/kdepim/; revision=870472 --- configuredialog.cpp | 10 +++++----- kmcomposewin.cpp | 7 +++---- kmmsgbase.cpp | 14 ++++++++++++++ kmmsgbase.h | 8 ++++++++ kmreaderwin.cpp | 4 ++-- 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/configuredialog.cpp b/configuredialog.cpp index 5ac23fbdf..2a95764a5 100644 --- a/configuredialog.cpp +++ b/configuredialog.cpp @@ -2138,8 +2138,8 @@ void AppearancePage::ReaderTab::readCurrentFallbackCodec() bool found = false; for( ; it != end; ++it) { - const QString encoding = KGlobal::charsets()->encodingForName(*it); - if ( encoding == "ISO 8859-15" ) + const QString encoding = KMMsgBase::encodingForName(*it); + if ( encoding == "ISO-8859-15" ) indexOfLatin9 = i; if( encoding == currentEncoding ) { @@ -2167,7 +2167,7 @@ void AppearancePage::ReaderTab::readCurrentOverrideCodec() int i = 0; for( ; it != end; ++it) { - if( KGlobal::charsets()->encodingForName(*it) == currentOverrideEncoding ) + if( KMMsgBase::encodingForName(*it) == currentOverrideEncoding ) { mOverrideCharsetCombo->setCurrentIndex( i ); break; @@ -2211,11 +2211,11 @@ void AppearancePage::ReaderTab::save() { GlobalSettings::self()->setCollapseQuoteLevelSpin( mCollapseQuoteLevelSpin->value() ); GlobalSettings::self()->setFallbackCharacterEncoding( - KGlobal::charsets()->encodingForName( mCharsetCombo->currentText() ) ); + KMMsgBase::encodingForName( mCharsetCombo->currentText() ) ); GlobalSettings::self()->setOverrideCharacterEncoding( mOverrideCharsetCombo->currentIndex() == 0 ? QString() : - KGlobal::charsets()->encodingForName( mOverrideCharsetCombo->currentText() ) ); + KMMsgBase::encodingForName( mOverrideCharsetCombo->currentText() ) ); } diff --git a/kmcomposewin.cpp b/kmcomposewin.cpp index b9efcf757..0b0c4a089 100644 --- a/kmcomposewin.cpp +++ b/kmcomposewin.cpp @@ -2245,7 +2245,7 @@ void KMComposeWin::setCharset( const QByteArray &aCharset, bool forceDefault ) ++it, i++ ) { if (i > 0 && ((mCharset == "us-ascii" && i == 1) || (i != 1 && KGlobal::charsets()->codecForName( - KGlobal::charsets()->encodingForName(*it)) + KGlobal::charsets()->encodingForName(*it)) == KGlobal::charsets()->codecForName(mCharset)))) { mEncodingAction->setCurrentItem( i ); @@ -2470,7 +2470,7 @@ void KMComposeWin::slotInsertFile() { KConfig *config = KMKernel::config(); KConfigGroup group( config, "Composer" ); - QString encoding = KGlobal::charsets()->encodingForName(encodingStr).toLatin1(); + QString encoding = KMMsgBase::encodingForName(encodingStr).toLatin1(); QStringList urls = group.readEntry( "recent-urls", QStringList() ); QStringList encodings = group.readEntry( "recent-encodings", QStringList() ); // Prevent config file from growing without bound @@ -2534,8 +2534,7 @@ void KMComposeWin::slotSetCharset() } mAutoCharset = false; - mCharset = KGlobal::charsets()->encodingForName( mEncodingAction-> - currentText() ).toLatin1(); + mCharset = KMMsgBase::encodingForName( mEncodingAction->currentText() ).toLatin1(); } //----------------------------------------------------------------------------- diff --git a/kmmsgbase.cpp b/kmmsgbase.cpp index 3e1d3d834..1ec31f65d 100644 --- a/kmmsgbase.cpp +++ b/kmmsgbase.cpp @@ -399,6 +399,20 @@ QStringList KMMsgBase::supportedEncodings(bool usAscii) return encodings; } +//----------------------------------------------------------------------------- +QString KMMsgBase::encodingForName( const QString &descriptiveName ) +{ + QString encoding = KGlobal::charsets()->encodingForName( descriptiveName ); + + // According to http://www.iana.org/assignments/character-sets, uppercase is + // prefered in MIME headers + if ( encoding.toUpper().contains( "ISO " ) ) { + encoding = encoding.toUpper(); + encoding.replace( "ISO ", "ISO-" ); + } + return encoding; +} + //----------------------------------------------------------------------------- QByteArray fallbackCharsetForRFC2047Decoding( const QByteArray &prefCharset ) { diff --git a/kmmsgbase.h b/kmmsgbase.h index 22c1dd3c6..539e1d163 100644 --- a/kmmsgbase.h +++ b/kmmsgbase.h @@ -259,6 +259,14 @@ public: /** Return a list of the supported encodings */ static QStringList supportedEncodings(bool usAscii); + /** + * Drop-in replacement for KCharsets::encodingForName(). The problem with + * the KCharsets function is that it returns "human-readable" encoding names + * like "ISO 8859-15" instead of valid encoding names like "ISO-8859-15". + * This function fixes this by replacing whitespace with a hyphen. + */ + static QString encodingForName( const QString &descriptiveName ); + /** Copy all values from other to this object. */ void assign(const KMMsgBase* other); diff --git a/kmreaderwin.cpp b/kmreaderwin.cpp index abab20842..a0d6104ef 100644 --- a/kmreaderwin.cpp +++ b/kmreaderwin.cpp @@ -1118,7 +1118,7 @@ void KMReaderWin::setOverrideEncoding( const QString & encoding ) QStringList encodings = mSelectEncodingAction->items(); int i = 0; for ( QStringList::const_iterator it = encodings.begin(), end = encodings.end(); it != end; ++it, ++i ) { - if ( KGlobal::charsets()->encodingForName( *it ) == encoding ) { + if ( KMMsgBase::encodingForName( *it ) == encoding ) { mSelectEncodingAction->setCurrentItem( i ); break; } @@ -1158,7 +1158,7 @@ void KMReaderWin::slotSetEncoding() if ( mSelectEncodingAction->currentItem() == 0 ) // Auto mOverrideEncoding.clear(); else - mOverrideEncoding = KGlobal::charsets()->encodingForName( mSelectEncodingAction->currentText() ); + mOverrideEncoding = KMMsgBase::encodingForName( mSelectEncodingAction->currentText() ); update( true ); }