diff options
Diffstat (limited to 'kmail/attachmentstrategy.cpp')
-rw-r--r-- | kmail/attachmentstrategy.cpp | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/kmail/attachmentstrategy.cpp b/kmail/attachmentstrategy.cpp new file mode 100644 index 000000000..37584d847 --- /dev/null +++ b/kmail/attachmentstrategy.cpp @@ -0,0 +1,209 @@ +/* -*- c++ -*- + attachmentstrategy.cpp + + This file is part of KMail, the KDE mail client. + Copyright (c) 2003 Marc Mutz <mutz@kde.org> + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "attachmentstrategy.h" + +#include "partNode.h" +#include "kmmsgpart.h" + +#include <qstring.h> + +#include <kdebug.h> + + +namespace KMail { + + + // + // IconicAttachmentStrategy: + // show everything but the first text/plain body as icons + // + + class IconicAttachmentStrategy : public AttachmentStrategy { + friend class ::KMail::AttachmentStrategy; + protected: + IconicAttachmentStrategy() : AttachmentStrategy() {} + virtual ~IconicAttachmentStrategy() {} + + public: + const char * name() const { return "iconic"; } + const AttachmentStrategy * next() const { return smart(); } + const AttachmentStrategy * prev() const { return hidden(); } + + bool inlineNestedMessages() const { return false; } + Display defaultDisplay( const partNode * ) const { return AsIcon; } + }; + + // + // SmartAttachmentStrategy: + // in addition to Iconic, show all body parts + // with content-disposition == "inline" and + // all text parts without a filename or name parameter inline + // + + class SmartAttachmentStrategy : public AttachmentStrategy { + friend class ::KMail::AttachmentStrategy; + protected: + SmartAttachmentStrategy() : AttachmentStrategy() {} + virtual ~SmartAttachmentStrategy() {} + + public: + const char * name() const { return "smart"; } + const AttachmentStrategy * next() const { return inlined(); } + const AttachmentStrategy * prev() const { return iconic(); } + + bool inlineNestedMessages() const { return true; } + Display defaultDisplay( const partNode * node ) const { + if ( node->hasContentDispositionInline() ) + // explict "inline" disposition: + return Inline; + if ( node->isAttachment() ) + // explicit "attachment" disposition: + return AsIcon; + if ( node->type() == DwMime::kTypeText && + node->msgPart().fileName().stripWhiteSpace().isEmpty() && + node->msgPart().name().stripWhiteSpace().isEmpty() ) + // text/* w/o filename parameter: + return Inline; + return AsIcon; + } + }; + + // + // InlinedAttachmentStrategy: + // show everything possible inline + // + + class InlinedAttachmentStrategy : public AttachmentStrategy { + friend class ::KMail::AttachmentStrategy; + protected: + InlinedAttachmentStrategy() : AttachmentStrategy() {} + virtual ~InlinedAttachmentStrategy() {} + + public: + const char * name() const { return "inlined"; } + const AttachmentStrategy * next() const { return hidden(); } + const AttachmentStrategy * prev() const { return smart(); } + + bool inlineNestedMessages() const { return true; } + Display defaultDisplay( const partNode * ) const { return Inline; } + }; + + // + // HiddenAttachmentStrategy + // show nothing except the first text/plain body part _at all_ + // + + class HiddenAttachmentStrategy : public AttachmentStrategy { + friend class ::KMail::AttachmentStrategy; + protected: + HiddenAttachmentStrategy() : AttachmentStrategy() {} + virtual ~HiddenAttachmentStrategy() {} + + public: + const char * name() const { return "hidden"; } + const AttachmentStrategy * next() const { return iconic(); } + const AttachmentStrategy * prev() const { return inlined(); } + + bool inlineNestedMessages() const { return false; } + Display defaultDisplay( const partNode * ) const { return None; } + }; + + + // + // AttachmentStrategy abstract base: + // + + AttachmentStrategy::AttachmentStrategy() { + + } + + AttachmentStrategy::~AttachmentStrategy() { + + } + + const AttachmentStrategy * AttachmentStrategy::create( Type type ) { + switch ( type ) { + case Iconic: return iconic(); + case Smart: return smart(); + case Inlined: return inlined(); + case Hidden: return hidden(); + } + kdFatal( 5006 ) << "AttachmentStrategy::create(): Unknown attachment startegy ( type == " + << (int)type << " ) requested!" << endl; + return 0; // make compiler happy + } + + const AttachmentStrategy * AttachmentStrategy::create( const QString & type ) { + QString lowerType = type.lower(); + if ( lowerType == "iconic" ) return iconic(); + //if ( lowerType == "smart" ) return smart(); // not needed, see below + if ( lowerType == "inlined" ) return inlined(); + if ( lowerType == "hidden" ) return hidden(); + // don't kdFatal here, b/c the strings are user-provided + // (KConfig), so fail gracefully to the default: + return smart(); + } + + static const AttachmentStrategy * iconicStrategy = 0; + static const AttachmentStrategy * smartStrategy = 0; + static const AttachmentStrategy * inlinedStrategy = 0; + static const AttachmentStrategy * hiddenStrategy = 0; + + const AttachmentStrategy * AttachmentStrategy::iconic() { + if ( !iconicStrategy ) + iconicStrategy = new IconicAttachmentStrategy(); + return iconicStrategy; + } + + const AttachmentStrategy * AttachmentStrategy::smart() { + if ( !smartStrategy ) + smartStrategy = new SmartAttachmentStrategy(); + return smartStrategy; + } + + const AttachmentStrategy * AttachmentStrategy::inlined() { + if ( !inlinedStrategy ) + inlinedStrategy = new InlinedAttachmentStrategy(); + return inlinedStrategy; + } + + const AttachmentStrategy * AttachmentStrategy::hidden() { + if ( !hiddenStrategy ) + hiddenStrategy = new HiddenAttachmentStrategy(); + return hiddenStrategy; + } + +} // namespace KMail |