You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
5.7 KiB
199 lines
5.7 KiB
/* Copyright 2009 Thomas McGuire <mcguire@kde.org> |
|
|
|
This program is free software; you can redistribute it and/or |
|
modify it under the terms of the GNU General Public License as |
|
published by the Free Software Foundation; either version 2 of |
|
the License or (at your option) version 3 or any later version |
|
accepted by the membership of KDE e.V. (or its successor approved |
|
by the membership of KDE e.V.), which shall act as a proxy |
|
defined in Section 14 of version 3 of the license. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
*/ |
|
#include "stringutil.h" |
|
#include "messageviewer/stringutil.h" |
|
|
|
#ifndef KMAIL_UNITTESTS |
|
|
|
#include "messageviewer/kmaddrbook.h" |
|
#include "kmkernel.h" |
|
|
|
#include <libkdepim/kaddrbookexternal.h> |
|
#include <mimelib/enum.h> |
|
|
|
#include <kmime/kmime_charfreq.h> |
|
#include <kmime/kmime_header_parsing.h> |
|
#include <kmime/kmime_util.h> |
|
|
|
#include <KPIMUtils/Email> |
|
#include <KPIMIdentities/IdentityManager> |
|
#include <kmime/kmime_util.h> |
|
|
|
#include <kascii.h> |
|
#include <KConfigGroup> |
|
#include <KDebug> |
|
#include <KUrl> |
|
#include <kuser.h> |
|
|
|
#include <QHostInfo> |
|
#include <QRegExp> |
|
#endif |
|
#include <QStringList> |
|
|
|
#ifndef KMAIL_UNITTESTS |
|
|
|
using namespace KMime; |
|
using namespace KMime::Types; |
|
using namespace KMime::HeaderParsing; |
|
|
|
#endif |
|
|
|
namespace KMail |
|
{ |
|
|
|
namespace StringUtil |
|
{ |
|
|
|
#ifndef KMAIL_UNITTESTS |
|
//----------------------------------------------------------------------------- |
|
QList<int> determineAllowedCtes( const CharFreq& cf, |
|
bool allow8Bit, |
|
bool willBeSigned ) |
|
{ |
|
QList<int> allowedCtes; |
|
|
|
switch ( cf.type() ) { |
|
case CharFreq::SevenBitText: |
|
allowedCtes << DwMime::kCte7bit; |
|
case CharFreq::EightBitText: |
|
if ( allow8Bit ) |
|
allowedCtes << DwMime::kCte8bit; |
|
case CharFreq::SevenBitData: |
|
if ( cf.printableRatio() > 5.0/6.0 ) { |
|
// let n the length of data and p the number of printable chars. |
|
// Then base64 \approx 4n/3; qp \approx p + 3(n-p) |
|
// => qp < base64 iff p > 5n/6. |
|
allowedCtes << DwMime::kCteQp; |
|
allowedCtes << DwMime::kCteBase64; |
|
} else { |
|
allowedCtes << DwMime::kCteBase64; |
|
allowedCtes << DwMime::kCteQp; |
|
} |
|
break; |
|
case CharFreq::EightBitData: |
|
allowedCtes << DwMime::kCteBase64; |
|
break; |
|
case CharFreq::None: |
|
default: |
|
// just nothing (avoid compiler warning) |
|
; |
|
} |
|
|
|
// In the following cases only QP and Base64 are allowed: |
|
// - the buffer will be OpenPGP/MIME signed and it contains trailing |
|
// whitespace (cf. RFC 3156) |
|
// - a line starts with "From " |
|
if ( ( willBeSigned && cf.hasTrailingWhitespace() ) || |
|
cf.hasLeadingFrom() ) { |
|
allowedCtes.removeAll( DwMime::kCte8bit ); |
|
allowedCtes.removeAll( DwMime::kCte7bit ); |
|
} |
|
|
|
return allowedCtes; |
|
} |
|
|
|
|
|
QString emailAddrAsAnchor( const QString& aEmail, Display display, const QString& cssStyle, |
|
Link link, AddressMode expandable, const QString& fieldName ) |
|
{ |
|
if( aEmail.isEmpty() ) |
|
return aEmail; |
|
|
|
const QStringList addressList = KPIMUtils::splitAddressList( aEmail ); |
|
|
|
QString result; |
|
int numberAddresses = 0; |
|
bool expandableInserted = false; |
|
|
|
for( QStringList::ConstIterator it = addressList.constBegin(); |
|
( it != addressList.constEnd() ); |
|
++it ) { |
|
if( !(*it).isEmpty() ) { |
|
numberAddresses++; |
|
|
|
QString address = *it; |
|
if( expandable == ExpandableAddresses && |
|
!expandableInserted && numberAddresses > GlobalSettings::self()->numberOfAddressesToShow() ) { |
|
Q_ASSERT( !fieldName.isEmpty() ); |
|
result = "<span id=\"icon" + fieldName + "\"></span>" + result; |
|
result += "<span id=\"dots" + fieldName + "\">...</span><span id=\"hidden" + fieldName +"\">"; |
|
expandableInserted = true; |
|
} |
|
if( link == ShowLink ) { |
|
result += "<a href=\"mailto:" |
|
+ MessageViewer::StringUtil::encodeMailtoUrl( address ) |
|
+ "\" "+cssStyle+">"; |
|
} |
|
if( display == DisplayNameOnly ) |
|
address = MessageViewer::StringUtil::stripEmailAddr( address ); |
|
result += MessageViewer::StringUtil::quoteHtmlChars( address, true ); |
|
if( link == ShowLink ) { |
|
result += "</a>, "; |
|
} |
|
} |
|
} |
|
// cut of the trailing ", " |
|
if( link == ShowLink ) { |
|
result.truncate( result.length() - 2 ); |
|
} |
|
if( expandableInserted ) { |
|
result += "</span>"; |
|
} |
|
|
|
//kDebug() << "('" << aEmail << "') returns:\n-->" << result << "<--"; |
|
return result; |
|
} |
|
|
|
|
|
QStringList stripMyAddressesFromAddressList( const QStringList& list ) |
|
{ |
|
QStringList addresses = list; |
|
for( QStringList::Iterator it = addresses.begin(); |
|
it != addresses.end(); ) { |
|
kDebug() << "Check whether" << *it <<"is one of my addresses"; |
|
if( kmkernel->identityManager()->thatIsMe( KPIMUtils::extractEmailAddress( *it ) ) ) { |
|
kDebug() << "Removing" << *it <<"from the address list"; |
|
it = addresses.erase( it ); |
|
} |
|
else |
|
++it; |
|
} |
|
return addresses; |
|
} |
|
|
|
#endif |
|
|
|
|
|
#ifndef KMAIL_UNITTESTS |
|
|
|
QMap<QString, QString> parseMailtoUrl ( const KUrl& url ) |
|
{ |
|
kDebug() << url.pathOrUrl(); |
|
QMap<QString, QString> values = url.queryItems( KUrl::CaseInsensitiveKeys ); |
|
QString to = MessageViewer::StringUtil::decodeMailtoUrl( url.path() ); |
|
to = to.isEmpty() ? values.value( "to" ) : to + QString( ", " ) + values.value( "to" ); |
|
values.insert( "to", to ); |
|
return values; |
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
}
|
|
|