From 9cadd9def98c7feecea26aa358c35b4a9e92fbf8 Mon Sep 17 00:00:00 2001 From: Michael Haeckel Date: Tue, 28 Nov 2000 17:23:05 +0000 Subject: [PATCH] Support for non latin filenames as attachment Part I Composing encodes them now correctely. svn path=/trunk/kdenetwork/kmail/; revision=72656 --- kmcomposewin.cpp | 3 ++- kmfoldertree.cpp | 2 +- kmmessage.cpp | 7 ++++--- kmmsgbase.cpp | 23 +++++++++++++++-------- kmmsgbase.h | 3 ++- kmmsgpart.cpp | 2 +- kmmsgpartdlg.cpp | 6 ++++++ 7 files changed, 31 insertions(+), 15 deletions(-) diff --git a/kmcomposewin.cpp b/kmcomposewin.cpp index b07398875..f0d2d381f 100644 --- a/kmcomposewin.cpp +++ b/kmcomposewin.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); diff --git a/kmfoldertree.cpp b/kmfoldertree.cpp index 618318bd6..b10fab862 100644 --- a/kmfoldertree.cpp +++ b/kmfoldertree.cpp @@ -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; diff --git a/kmmessage.cpp b/kmmessage.cpp index 240cee6e4..37b40e166 100644 --- a/kmmessage.cpp +++ b/kmmessage.cpp @@ -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 != "") diff --git a/kmmsgbase.cpp b/kmmsgbase.cpp index 26f8ba61a..296d66847 100644 --- a/kmmsgbase.cpp +++ b/kmmsgbase.cpp @@ -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; } diff --git a/kmmsgbase.h b/kmmsgbase.h index 66ac10997..dc4064caf 100644 --- a/kmmsgbase.h +++ b/kmmsgbase.h @@ -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); diff --git a/kmmsgpart.cpp b/kmmsgpart.cpp index 91acdb715..000b5316f 100644 --- a/kmmsgpart.cpp +++ b/kmmsgpart.cpp @@ -308,7 +308,7 @@ const QString KMMessagePart::contentDescription(void) const //----------------------------------------------------------------------------- void KMMessagePart::setContentDescription(const QString aStr) { - mContentDescription = aStr.copy(); + mContentDescription = KMMsgBase::encodeRFC2047String(aStr, charset()); } diff --git a/kmmsgpartdlg.cpp b/kmmsgpartdlg.cpp index 808c7d20f..9faffa0ec 100644 --- a/kmmsgpartdlg.cpp +++ b/kmmsgpartdlg.cpp @@ -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())