[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