Support for non latin filenames as attachment Part I

Composing encodes them now correctely.

svn path=/trunk/kdenetwork/kmail/; revision=72656
wilder-work
Michael Haeckel 26 years ago
parent 966359def4
commit 9cadd9def9
  1. 3
      kmcomposewin.cpp
  2. 2
      kmfoldertree.cpp
  3. 7
      kmmessage.cpp
  4. 23
      kmmsgbase.cpp
  5. 3
      kmmsgbase.h
  6. 2
      kmmsgpart.cpp
  7. 6
      kmmsgpartdlg.cpp

@ -1442,11 +1442,12 @@ void KMComposeWin::slotAttachFileResult(KIO::Job *job)
kernel->kbp()->busy();
i = urlStr.findRev('/');
name = (i>=0 ? urlStr.mid(i+1, 256) : urlStr);
QString encName = KMMsgBase::encodeRFC2231String(name);
QString encName = KMMsgBase::encodeRFC2231String(name, mCharset);
bool RFC2231encoded = name != encName;
// create message part
msgPart = new KMMessagePart;
msgPart->setCharset(mCharset);
msgPart->setName(name);
msgPart->setCteStr(mDefEncoding);
msgPart->setBodyEncoded((*it).data);

@ -677,7 +677,7 @@ void KMFolderTree::rightButtonPressed(QListViewItem *lvi, const QPoint &p, int)
//-----------------------------------------------------------------------------
// If middle button and folder holds mailing-list, create a message to that list
void KMFolderTree::mouseButtonPressed(int btn, QListViewItem *lvi, const QPoint &p, int)
void KMFolderTree::mouseButtonPressed(int btn, QListViewItem *lvi, const QPoint &, int)
{
// react on middle-button only
if (btn != Qt::MidButton) return;

@ -1831,17 +1831,18 @@ void KMMessage::deleteBodyParts(void)
//-----------------------------------------------------------------------------
void KMMessage::addBodyPart(const KMMessagePart* aPart)
{
QString charset = aPart->charset();
DwBodyPart* part = DwBodyPart::NewBodyPart(emptyString, 0);
QString type = aPart->typeStr();
QString subtype = aPart->subtypeStr();
QString cte = aPart->cteStr();
QString contDesc = KMMsgBase::encodeRFC2047String(aPart->
contentDescription(), aPart->charset());
contentDescription(), charset);
QString contDisp = aPart->contentDisposition();
QString name = KMMsgBase::encodeRFC2231String(aPart->name());
QString name = KMMsgBase::encodeRFC2231String(aPart->name(), charset);
bool RFC2231encoded = aPart->name() != name;
QString charset = aPart->charset();
DwHeaders& headers = part->Headers();
if (type != "" && subtype != "")

@ -460,12 +460,19 @@ const QString KMMsgBase::encodeRFC2047String(const QString& _str,
//-----------------------------------------------------------------------------
const QString KMMsgBase::encodeRFC2231String(const QString& _str)
const QString KMMsgBase::encodeRFC2231String(const QString& _str,
const QString& charset)
{
if (_str.isEmpty()) return _str;
char *latin = (char *)calloc(1, _str.length() + 1);
strcpy(latin, _str.latin1());
char *l = latin;
QString cset;
if (charset.isEmpty()) cset = KGlobal::locale()->charset();
else cset = charset;
QTextCodec *codec = QTextCodec::codecForName(cset);
QCString latin;
if (codec) latin = codec->fromUnicode(_str);
else latin = _str.local8Bit();
char *l = latin.data();
char hexcode;
int i;
bool quote;
@ -474,9 +481,10 @@ const QString KMMsgBase::encodeRFC2231String(const QString& _str)
if (*l < 0) break;
l++;
}
if (!*l) return _str;
QString result = QString("iso-8859-1''");
l = latin;
if (!*l) return latin;
QString result = cset;
result += QString("''");
l = latin.data();
while (*l)
{
quote = *l < 0;
@ -495,7 +503,6 @@ const QString KMMsgBase::encodeRFC2231String(const QString& _str)
}
l++;
}
free(latin);
return result;
}

@ -134,7 +134,8 @@ public:
/** Encode given string as described in RFC2231
(parameters in MIME headers) */
static const QString encodeRFC2231String(const QString& aStr);
static const QString encodeRFC2231String(const QString& aStr,
const QString& charset);
/** Decode given string as described in RFC2231 */
static const QString decodeRFC2231String(const QString& aStr);

@ -308,7 +308,7 @@ const QString KMMessagePart::contentDescription(void) const
//-----------------------------------------------------------------------------
void KMMessagePart::setContentDescription(const QString aStr)
{
mContentDescription = aStr.copy();
mContentDescription = KMMsgBase::encodeRFC2047String(aStr, charset());
}

@ -2,6 +2,7 @@
#include "kmmsgpartdlg.h"
#include "kmmsgpart.h"
#include "kmmsgbase.h"
#ifndef KRN
#include "kmglobal.h"
@ -206,7 +207,12 @@ void KMMsgPartDlg::applyChanges(void)
kernel->kbp()->busy();
str = mEdtName->text();
if (!str.isEmpty() || !mMsgPart->name().isEmpty())
{
mMsgPart->setName(str);
QString encName = KMMsgBase::encodeRFC2231String(str, mMsgPart->charset());
mMsgPart->setContentDisposition(QString("attachment; filename")
+ ((str != encName) ? "*" : "") + "=\"" + encName + "\"");
}
str = mEdtComment->text();
if (!str.isEmpty() || !mMsgPart->contentDescription().isEmpty())

Loading…
Cancel
Save