[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