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

List:       kmail-devel
Subject:    [Bug 98079] Change charset must be applied on subject and attachment
From:       Dmitry Morozhnikov <dmiceman () ubiz ! ru>
Date:       2006-11-07 23:14:26
Message-ID: 20061107231426.5956.qmail () ktown ! kde ! org
[Download RAW message or body]

------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
         
http://bugs.kde.org/show_bug.cgi?id=98079         




------- Additional Comments From dmiceman ubiz ru  2006-11-08 00:14 -------
SVN commit 603142 by dmiceman:

Suppose headers charset from content-type header if headers not 
properly encoded. If content-type charset is "us-ascii", use "utf-8" 
instead. Write maildir and mbox indexes in right encoding.

CCBUG:98079


 M  +30 -1     branches/work/kdepim-3.5.5+/kmail/kmfoldermaildir.cpp  
 M  +30 -1     branches/work/kdepim-3.5.5+/kmail/kmfoldermbox.cpp  
 M  +3 -2      branches/work/kdepim-3.5.5+/kmail/kmmessage.cpp  
 M  +14 -4     branches/work/kdepim-3.5.5+/kmail/kmmsgbase.cpp  
 M  +1 -1      branches/work/kdepim-3.5.5+/kmail/kmmsgbase.h  
 M  +6 -4      branches/work/kdepim-3.5.5+/kmail/kmmsginfo.cpp  
 M  +2 -0      branches/work/kdepim-3.5.5+/kmail/kmmsginfo.h  
 M  +2 -2      branches/work/kdepim-3.5.5+/kmail/kmmsgpart.cpp  


--- branches/work/kdepim-3.5.5+/kmail/kmfoldermaildir.cpp #603141:603142
 @ -653,6 +653,7  @
   QCString dateStr, fromStr, toStr, subjStr;
   QCString xmarkStr, replyToIdStr, msgIdStr, referencesStr;
   QCString statusStr, replyToAuxIdStr, uidStr;
+  QCString contentTypeStr, charset;
 
   // iterate through this file until done
   while (!atEof)
 @ -725,6 +726,29  @
           status |= KMMsgStatusFlag;
       }
 
+      contentTypeStr = contentTypeStr.stripWhiteSpace();
+      charset = "";
+      if ( !contentTypeStr.isEmpty() )
+      {
+        int cidx = contentTypeStr.find( "charset=" );
+        if ( cidx != -1 ) {
+          charset = contentTypeStr.mid( cidx + 8 );
+          if ( charset[0] == '"' ) {
+            charset = charset.mid( 1 );
+          }
+          cidx = 0;
+          while ( (unsigned int) cidx < charset.length() ) {
+            if ( charset[cidx] == '"' || ( !isalnum(charset[cidx]) &&
+                 charset[cidx] != '-' && charset[cidx] != '_' ) )
+              break;
+            ++cidx;
+          }
+          charset.truncate( cidx );
+          // kdDebug() << "KMFolderMaildir::readFileHeaderIntern() charset found: " \
<< +          //              charset << " from " << contentTypeStr << endl;
+        }
+      }
+
       KMMsgInfo *mi = new KMMsgInfo(folder());
       mi->init( subjStr.stripWhiteSpace(),
                 fromStr.stripWhiteSpace(),
 @ -734,7 +758,7  @
                 replyToIdStr, replyToAuxIdStr, msgIdStr,
 				file.local8Bit(),
                 KMMsgEncryptionStateUnknown, KMMsgSignatureStateUnknown,
-                KMMsgMDNStateUnknown, f.size() );
+                KMMsgMDNStateUnknown, charset, f.size() );
 
       dateStr = dateStr.stripWhiteSpace();
       if (!dateStr.isEmpty())
 @ -823,6 +847,11  @
       uidStr = QCString(line+6);
       lastStr = &uidStr;
     }
+    else if (strncasecmp(line, "Content-Type:", 13) == 0)
+    {
+      contentTypeStr = QCString(line+13);
+      lastStr = &contentTypeStr;
+    }
 
   }
 
--- branches/work/kdepim-3.5.5+/kmail/kmfoldermbox.cpp #603141:603142
 @ -552,6 +552,7  @
   QCString subjStr, dateStr, fromStr, toStr, xmarkStr, *lastStr=0;
   QCString replyToIdStr, replyToAuxIdStr, referencesStr, msgIdStr;
   QCString sizeServerStr, uidStr;
+  QCString contentTypeStr, charset;
   bool atEof = false;
   bool inHeader = true;
   KMMsgInfo* mi;
 @ -652,6 +653,29  @
               replyToAuxIdStr.truncate( rightAngle + 1 );
           }
 
+          contentTypeStr = contentTypeStr.stripWhiteSpace();
+          charset = "";
+          if ( !contentTypeStr.isEmpty() )
+          {
+            int cidx = contentTypeStr.find( "charset=" );
+            if ( cidx != -1 ) {
+              charset = contentTypeStr.mid( cidx + 8 );
+              if ( charset[0] == '"' ) {
+                charset = charset.mid( 1 );
+              }
+              cidx = 0;
+              while ( (unsigned int) cidx < charset.length() ) {
+                if ( charset[cidx] == '"' || ( !isalnum(charset[cidx]) &&
+                    charset[cidx] != '-' && charset[cidx] != '_' ) )
+                  break;
+                ++cidx;
+              }
+              charset.truncate( cidx );
+              // kdDebug() << "KMFolderMaildir::readFileHeaderIntern() charset \
found: " << +              //              charset << " from " << contentTypeStr << \
endl; +            }
+          }
+
           mi = new KMMsgInfo(folder());
           mi->init( subjStr.stripWhiteSpace(),
                     fromStr.stripWhiteSpace(),
 @ -660,7 +684,7  @
                     xmarkStr.stripWhiteSpace(),
                     replyToIdStr, replyToAuxIdStr, msgIdStr,
                     KMMsgEncryptionStateUnknown, KMMsgSignatureStateUnknown,
-                    KMMsgMDNStateUnknown, offs, size, sizeServer, uid );
+                    KMMsgMDNStateUnknown, charset, offs, size, sizeServer, uid );
           mi->setStatus(status, xstatus);
           mi->setDate( dateStr.stripWhiteSpace() );
           mi->setDirty(false);
 @ -766,6 +790,11  @
       uid = uidStr.toULong();
       lastStr = &uidStr;
     }
+    else if (strncasecmp(line, "Content-Type:", 13) == 0)
+    {
+      contentTypeStr = QCString(line+13);
+      lastStr = &contentTypeStr;
+    }
   }
 
   if (mAutoCreateIndex)
--- branches/work/kdepim-3.5.5+/kmail/kmmessage.cpp #603141:603142
 @ -2251,7 +2251,8  @
   if ( !mMsg->Headers().FindField( aName ) )
     return QString::null;
 
-  return decodeRFC2047String( mMsg->Headers().FieldBody( aName.data() \
).AsString().c_str() ); +  return decodeRFC2047String( mMsg->Headers().FieldBody( \
aName.data() ).AsString().c_str(), +                              charset() );
 }
 
 QStringList KMMessage::headerFields( const QCString& field ) const
 @ -2262,7 +2263,7  @
   std::vector<DwFieldBody*> v = mMsg->Headers().AllFieldBodies( field.data() );
   QStringList headerFields;
   for ( uint i = 0; i < v.size(); ++i ) {
-    headerFields.append( decodeRFC2047String( v[i]->AsString().c_str() ) );
+    headerFields.append( decodeRFC2047String( v[i]->AsString().c_str(), charset() ) \
);  }
 
   return headerFields;
--- branches/work/kdepim-3.5.5+/kmail/kmmsgbase.cpp #603141:603142
 @ -662,7 +662,7  @
 
 
 //-----------------------------------------------------------------------------
-QString KMMsgBase::decodeRFC2047String(const QCString& aStr)
+QString KMMsgBase::decodeRFC2047String(const QCString& aStr, QCString prefCharset)
 {
   if ( aStr.isEmpty() )
     return QString::null;
 @ -672,9 +672,19  @
   if ( str.isEmpty() )
     return QString::null;
 
-  if ( str.find( "=?" ) < 0 )
-    return KMMsgBase::codecForName( GlobalSettings::self()->
-                                    fallbackCharacterEncoding().latin1() \
)->toUnicode( str ); +  if ( str.find( "=?" ) < 0 ) {
+    if ( !prefCharset.isEmpty() ) {
+      if ( prefCharset == "us-ascii" ) {
+        // isn`t this foolproof?
+        return KMMsgBase::codecForName( "utf-8" )->toUnicode( str );
+      } else {
+        return KMMsgBase::codecForName( prefCharset )->toUnicode( str );
+      }
+    } else {
+      return KMMsgBase::codecForName( GlobalSettings::self()->
+                                      fallbackCharacterEncoding().latin1() \
)->toUnicode( str ); +    }
+  }
 
   QString result;
   QCString LWSP_buffer;
--- branches/work/kdepim-3.5.5+/kmail/kmmsgbase.h #603141:603142
 @ -354,7 +354,7  @
 
   /** This function handles both encodings described in RFC2047:
     Base64 ("=?iso-8859-1?b?...?=") and quoted-printable */
-  static QString decodeRFC2047String(const QCString& aStr);
+  static QString decodeRFC2047String(const QCString& aStr, const QCString \
prefCharset = "");  
   /** Encode given string as described in RFC2047:
     using quoted-printable. */
--- branches/work/kdepim-3.5.5+/kmail/kmmsginfo.cpp #603141:603142
 @ -199,6 +199,7  @
                      KMMsgEncryptionState encryptionState,
                      KMMsgSignatureState signatureState,
                      KMMsgMDNSentState mdnSentState,
+                     const QCString& prefCharset,
              off_t aFolderOffset, size_t aMsgSize,
              size_t aMsgSizeServer, ulong aUID)
 {
 @ -207,9 +208,9  @
     if(!kd)
         kd = new KMMsgInfoPrivate;
     kd->modifiers = KMMsgInfoPrivate::ALL_SET;
-    kd->subject = decodeRFC2047String(aSubject);
-    kd->from = decodeRFC2047String( KMMessage::stripEmailAddr( aFrom ) );
-    kd->to = decodeRFC2047String( KMMessage::stripEmailAddr( aTo ) );
+    kd->subject = decodeRFC2047String(aSubject, prefCharset);
+    kd->from = decodeRFC2047String( KMMessage::stripEmailAddr( aFrom ), prefCharset \
); +    kd->to = decodeRFC2047String( KMMessage::stripEmailAddr( aTo ), prefCharset \
);  kd->replyToIdMD5 = base64EncodedMD5( replyToId );
     kd->replyToAuxIdMD5 = base64EncodedMD5( replyToAuxId );
     kd->strippedSubjectMD5 = base64EncodedMD5( KMMessage::stripOffPrefixes( \
kd->subject ), true /*utf8*/ );  @ -237,12 +238,13  @
                      KMMsgEncryptionState encryptionState,
                      KMMsgSignatureState signatureState,
                      KMMsgMDNSentState mdnSentState,
+                     const QCString& prefCharset,
                      size_t aMsgSize,
              size_t aMsgSizeServer, ulong aUID)
 {
   // use the "normal" init for most stuff
   init( aSubject, aFrom, aTo, aDate, aStatus, aXMark, replyToId, replyToAuxId,
-        msgId, encryptionState, signatureState, mdnSentState,
+        msgId, encryptionState, signatureState, mdnSentState, prefCharset,
         (unsigned long)0, aMsgSize, aMsgSizeServer, aUID );
   kd->file = aFileName;
 }
--- branches/work/kdepim-3.5.5+/kmail/kmmsginfo.h #603141:603142
 @ -46,6 +46,7  @
 		    KMMsgEncryptionState encryptionState,
 		    KMMsgSignatureState signatureState,
 		    KMMsgMDNSentState mdnSentState,
+                    const QCString& prefCharset,
 		    off_t folderOffset=0, size_t msgSize=0,
             size_t msgSizeServer = 0, ulong UID = 0);
 
 @ -60,6 +61,7  @
 		    KMMsgEncryptionState encryptionState,
 		    KMMsgSignatureState signatureState,
 		    KMMsgMDNSentState mdnSentState,
+                    const QCString& prefCharset,
 		    size_t msgSize=0,
             size_t msgSizeServer = 0, ulong UID = 0);
 
--- branches/work/kdepim-3.5.5+/kmail/kmmsgpart.cpp #603141:603142
 @ -476,7 +476,7  @
 //-----------------------------------------------------------------------------
 QString KMMessagePart::contentDescription(void) const
 {
-  return KMMsgBase::decodeRFC2047String(mContentDescription);
+  return KMMsgBase::decodeRFC2047String(mContentDescription, charset());
 }
 
 
 @ -527,7 +527,7  @
   if (bRFC2231encoded)
     return KMMsgBase::decodeRFC2231String(str);
   else
-    return KMMsgBase::decodeRFC2047String(str);
+    return KMMsgBase::decodeRFC2047String(str, charset());
 }
_______________________________________________
KMail developers mailing list
KMail-devel@kde.org
https://mail.kde.org/mailman/listinfo/kmail-devel


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

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