[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdepim
From:       Leo Franchi <lfranchi () kde ! org>
Date:       2010-04-29 15:00:25
Message-ID: 20100429150025.81E7AAC8A7 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1120649 by lfranchi:

move preferred charset list into libmessagecomposer
properly encode replies to original message charset if option is selected, if fails, \
use preferred ones.


 M  +2 -1      kmail/codecmanager.cpp  
 M  +2 -2      kmail/configuredialog.cpp  
 M  +0 -4      kmail/kmail.kcfg.cmake  
 M  +3 -0      messagecomposer/messagecomposer.kcfg  
 M  +33 -3     messagecomposer/messagefactory.cpp  
 M  +8 -0      messagecomposer/messagefactory.h  


--- trunk/KDE/kdepim/kmail/codecmanager.cpp #1120648:1120649
@@ -37,6 +37,7 @@
 #include <KDebug>
 #include <KGlobal>
 #include <KLocale>
+#include <messagecomposersettings.h>
 
 class CodecManagerPrivate
 {
@@ -83,7 +84,7 @@
 
 void CodecManager::updatePreferredCharsets()
 {
-  const QStringList prefCharsets = GlobalSettings::self()->preferedCharsets();
+  const QStringList prefCharsets = \
MessageComposer::MessageComposerSettings::self()->preferredCharsets();  \
d->preferredCharsets.clear();  foreach( const QString &str, prefCharsets ) {
     QByteArray charset = str.toLatin1().toLower();
--- trunk/KDE/kdepim/kmail/configuredialog.cpp #1120648:1120649
@@ -2800,7 +2800,7 @@
 {
   KConfigGroup composer( KMKernel::config(), "Composer" );
 
-  QStringList charsets = GlobalSettings::preferedCharsets();
+  QStringList charsets = \
MessageComposer::MessageComposerSettings::preferredCharsets();  for ( \
QStringList::Iterator it = charsets.begin() ;  it != charsets.end() ; ++it )
     if ( (*it) == QString::fromLatin1("locale") ) {
@@ -2822,7 +2822,7 @@
   for ( ; it != charsetList.end() ; ++it )
     if ( (*it).endsWith( QLatin1String("(locale)") ) )
       (*it) = "locale";
-  GlobalSettings::setPreferedCharsets( charsetList );
+  MessageComposer::MessageComposerSettings::setPreferredCharsets( charsetList );
   MessageComposer::MessageComposerSettings::setForceReplyCharset( \
mKeepReplyCharsetCheck->isChecked() );  }
 
--- trunk/KDE/kdepim/kmail/kmail.kcfg.cmake #1120648:1120649
@@ -383,10 +383,6 @@
           <default>false</default>
       </entry>
 
-      <entry name="PreferedCharsets" key="pref-charsets" type="StringList">
-          <default>us-ascii,iso-8859-1,locale,utf-8</default>
-      </entry>
-
     </group>
 <!-- Composer -->
 
--- trunk/KDE/kdepim/messagecomposer/messagecomposer.kcfg #1120648:1120649
@@ -43,6 +43,9 @@
         <default>false</default>
       </entry>
 
+      <entry name="PreferredCharsets" key="pref-charsets" type="StringList">
+          <default>us-ascii,iso-8859-1,locale,utf-8</default>
+      </entry>
     
   </group>
 
--- trunk/KDE/kdepim/messagecomposer/messagefactory.cpp #1120648:1120649
@@ -21,6 +21,7 @@
 
 #include "messageinfo.h"
 #include "messagecomposersettings.h"
+#include "util.h"
 
 #include <akonadi/item.h>
 #include <messageviewer/kcursorsaver.h>
@@ -36,6 +37,8 @@
 #include "templateparser/templateparser.h"
 #include <messagecore/mailinglist-magic.h>
 #include <KLocalizedString>
+#include <kcharsets.h>
+#include <QTextCodec>
 
 
 MessageFactory::MessageFactory( const KMime::Message::Ptr& origMsg, \
Akonadi::Item::Id id ) @@ -258,10 +261,9 @@
     else
       parser.process( m_origMsg );
   }
-  if( MessageComposer::MessageComposerSettings::forceReplyCharset() ) {
-    msg->contentType()->setCharset( m_origMsg->contentType()->charset() );
-  }
     
+  applyCharset( msg );
+    
   link( msg, m_id, KPIM::MessageStatus::statusReplied() );
   if ( m_parentFolderId > 0 ) {
     KMime::Headers::Generic *header = new KMime::Headers::Generic( "X-KMail-Fcc", \
msg.get(), QString::number( m_parentFolderId ), "utf-8" ); @@ -272,6 +274,7 @@
         m_origMsg->headerByType( \
QLatin1String("X-KMail-EncryptActionEnabled").latin1() )->as7BitString() == "true" ) \
                {
     msg->setHeader( new KMime::Headers::Generic( "X-KMail-EncryptActionEnabled", \
msg.get(), QLatin1String("true"), "utf-8" ) );  }
+  msg->assemble();
 
   MessageReply reply;
   reply.msg = msg;
@@ -338,7 +341,10 @@
   else
     parser.process( m_origMsg );
 
+  applyCharset( msg );
+
   link( msg, m_id, KPIM::MessageStatus::statusForwarded() );
+  msg->assemble();
   return msg;
 }
 
@@ -825,7 +831,31 @@
     return result;
 }
 
+void MessageFactory::applyCharset( const KMime::Message::Ptr msg )
+{
+  if( MessageComposer::MessageComposerSettings::forceReplyCharset() ) {
+    msg->contentType()->setCharset( m_origMsg->contentType()->charset() );
 
+    QTextCodec *codec = KGlobal::charsets()->codecForName( QString::fromLatin1( \
msg->contentType()->charset() ) ); +    if( !codec ) {
+      kError() << "Could not get text codec for charset" << \
msg->contentType()->charset(); +    } else if( !codec->canEncode( \
QString::fromLatin1( msg->body() ) ) ) { // charset can't encode body, fall back to \
preferred +      const QStringList charsets = \
MessageComposer::MessageComposerSettings::preferredCharsets(); +      \
QList<QByteArray> chars; +      foreach( QString charset, charsets )
+        chars << charset.toAscii();
+      QByteArray fallbackCharset = Message::Util::selectCharset( chars, \
QString::fromLatin1( msg->body() ) ); +      if( fallbackCharset.isEmpty() ) // UTF-8 \
as fall-through +        fallbackCharset = "UTF-8";
+      codec = KGlobal::charsets()->codecForName( QString::fromLatin1( \
fallbackCharset ) ); +      msg->setBody( codec->fromUnicode( QString::fromLatin1( \
msg->body() ) ) ); +    } else {
+      msg->setBody( codec->fromUnicode( QString::fromLatin1( msg->body() ) ) );
+    }
+  }
+}
+
+
 QByteArray MessageFactory::getRefStr( const KMime::Message::Ptr &msg )
 {
   QByteArray firstRef, lastRef, refStr, retRefStr;
--- trunk/KDE/kdepim/messagecomposer/messagefactory.h #1120648:1120649
@@ -236,6 +236,14 @@
   uint identityUoid(const KMime::Message::Ptr &msg );
 
   QString replaceHeadersInString( const KMime::Message::Ptr &msg, const QString & s \
); +
+  /*
+   * If force charset option is enabled, try to set the original charset
+   *  in the newly created message. If unable to encode, fall back to
+   *  preferred charsets, and if all fail, use UTF-8.
+   */
+  void applyCharset( const KMime::Message::Ptr msg );
+  
   QByteArray getRefStr( const KMime::Message::Ptr &msg );
   
   // TODO move IdentityManager used in KMail to kdepimlibs when not in freeze


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic