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

List:       kde-bugs-dist
Subject:    [Bug 98079] Change charset must be applied on subject and attachment
From:       Allen Winter <winter () kde ! org>
Date:       2006-12-16 5:26:19
Message-ID: 20061216052619.14600.qmail () ktown ! kde ! org
[Download RAW message or body]

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
         
http://bugs.kde.org/show_bug.cgi?id=98079         
winter kde org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED



------- Additional Comments From winter kde org  2006-12-16 06:26 -------
SVN commit 614058 by winterz:

merge 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.

BUGS:98079


 M  +33 -4     kmfoldermaildir.cpp  
 M  +32 -3     kmfoldermbox.cpp  
 M  +4 -2      kmmessage.cpp  
 M  +14 -4     kmmsgbase.cpp  
 M  +2 -2      kmmsgbase.h  
 M  +6 -4      kmmsginfo.cpp  
 M  +3 -1      kmmsginfo.h  
 M  +6 -6      kmmsgpart.cpp  


--- branches/KDE/3.5/kdepim/kmail/kmfoldermaildir.cpp #614057:614058
 @ -426,7 +426,7  @
   tmp_file += filename;
 
   if (!KPIM::kCStringToFile(msgText, tmp_file, false, false, false))
-    kmkernel->emergencyExit( i18n("Message could not be added to the folder, \
possibly disk space is low.") );  +    kmkernel->emergencyExit( i18n("Message could \
not be added to the folder, possibly disk space is low.") );  
   QFile file(tmp_file);
   size = msgText.length();
 @ -477,10 +477,10  @
   }
   ++mTotalMsgs;
 
-  if ( aMsg->attachmentState() == KMMsgAttachmentUnknown && 
+  if ( aMsg->attachmentState() == KMMsgAttachmentUnknown &&
        aMsg->readyToShow() )
     aMsg->updateAttachmentState();
-  
+
   // store information about the position in the folder file in the message
   aMsg->setParent(folder());
   aMsg->setMsgSize(size);
 @ -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/KDE/3.5/kdepim/kmail/kmfoldermbox.cpp #614057:614058
 @ -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)
 @ -1071,10 +1100,10  @
   }
   ++mTotalMsgs;
 
-  if ( aMsg->attachmentState() == KMMsgAttachmentUnknown && 
+  if ( aMsg->attachmentState() == KMMsgAttachmentUnknown &&
        aMsg->readyToShow() )
     aMsg->updateAttachmentState();
-  
+
   // store information about the position in the folder file in the message
   aMsg->setParent(folder());
   aMsg->setFolderOffset(offs);
--- branches/KDE/3.5/kdepim/kmail/kmmessage.cpp #614057:614058
 @ -2216,7 +2216,9  @
   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
 @ -2227,7 +2229,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/KDE/3.5/kdepim/kmail/kmmsgbase.cpp #614057:614058
 @ -646,7 +646,7  @
 
 
 //-----------------------------------------------------------------------------
-QString KMMsgBase::decodeRFC2047String(const QCString& aStr)
+QString KMMsgBase::decodeRFC2047String(const QCString& aStr, QCString prefCharset)
 {
   if ( aStr.isEmpty() )
     return QString::null;
 @ -656,9 +656,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/KDE/3.5/kdepim/kmail/kmmsgbase.h #614057:614058
 @ -32,7 +32,7  @
 class KMFolder;
 class KMFolderIndex;
 
-/** The new status format. These can be or'd together. 
+/** The new status format. These can be or'd together.
     Note, that the KMMsgStatusIgnored implies the
     status to be Read even if the flags are set
     to Unread or New. This is done in KMMsgBase::isRead()
 @ -341,7 +341,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/KDE/3.5/kdepim/kmail/kmmsginfo.cpp #614057:614058
 @ -186,6 +186,7  @
                      KMMsgEncryptionState encryptionState,
                      KMMsgSignatureState signatureState,
                      KMMsgMDNSentState mdnSentState,
+                     const QCString& prefCharset,
              off_t aFolderOffset, size_t aMsgSize,
              size_t aMsgSizeServer, ulong aUID)
 {
 @ -194,9 +195,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*/ );  @ -224,12 +225,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/KDE/3.5/kdepim/kmail/kmmsginfo.h #614057:614058
 @ -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,7 +61,8  @
 		    KMMsgEncryptionState encryptionState,
 		    KMMsgSignatureState signatureState,
 		    KMMsgMDNSentState mdnSentState,
-		    size_t msgSize=0,
+		    const QCString& prefCharset,
+                    size_t msgSize=0,
             size_t msgSizeServer = 0, ulong UID = 0);
 
   /** Inherited methods (see KMMsgBase for description): */
--- branches/KDE/3.5/kdepim/kmail/kmmsgpart.cpp #614057:614058
 @ -390,14 +390,14  @
   QString fileName =
     KMimeType::mimeType( mimeType )->icon( QString::null, false );
   if ( fileName.isEmpty() )
-  { 
-    fileName = this->fileName(); 
-    if ( fileName.isEmpty() ) fileName = this->name(); 
+  {
+    fileName = this->fileName();
+    if ( fileName.isEmpty() ) fileName = this->name();
     if ( !fileName.isEmpty() )
     {
       fileName = KMimeType::findByPath( "/tmp/"+fileName, 0, true )->icon( \
QString::null, true );  }
-  } 
+  }
 
   fileName =
     KGlobal::instance()->iconLoader()->iconPath( fileName, KIcon::Desktop );
 @ -487,7 +487,7  @
 //-----------------------------------------------------------------------------
 QString KMMessagePart::contentDescription(void) const
 {
-  return KMMsgBase::decodeRFC2047String(mContentDescription);
+  return KMMsgBase::decodeRFC2047String(mContentDescription, charset());
 }
 
 
 @ -538,7 +538,7  @
   if (bRFC2231encoded)
     return KMMsgBase::decodeRFC2231String(str);
   else
-    return KMMsgBase::decodeRFC2047String(str);
+    return KMMsgBase::decodeRFC2047String(str, charset());
 }


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

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