summaryrefslogtreecommitdiffstats
path: root/kmail/bodypartformatter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmail/bodypartformatter.cpp')
-rw-r--r--kmail/bodypartformatter.cpp334
1 files changed, 334 insertions, 0 deletions
diff --git a/kmail/bodypartformatter.cpp b/kmail/bodypartformatter.cpp
new file mode 100644
index 000000000..efe12f672
--- /dev/null
+++ b/kmail/bodypartformatter.cpp
@@ -0,0 +1,334 @@
+/* -*- c++ -*-
+ bodypartformatter.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 "bodypartformatter.h"
+#include "bodypartformatterfactory_p.h"
+#include "interfaces/bodypartformatter.h"
+
+#include "objecttreeparser.h"
+#include "partNode.h"
+
+#include <mimelib/enum.h>
+#include <mimelib/string.h>
+#include <mimelib/utility.h>
+
+#include <kdebug.h>
+#include <kasciistricmp.h>
+
+namespace {
+ class AnyTypeBodyPartFormatter
+ : public KMail::BodyPartFormatter,
+ public KMail::Interface::BodyPartFormatter {
+ static const AnyTypeBodyPartFormatter * self;
+ public:
+ Result format( KMail::Interface::BodyPart *, KMail::HtmlWriter * ) const {
+ kdDebug(5006) << "AnyTypeBodyPartFormatter::format() acting as a KMail::Interface::BodyPartFormatter!" << endl;
+ return AsIcon;
+ }
+
+ bool process( KMail::ObjectTreeParser *, partNode *, KMail::ProcessResult & result ) const {
+ result.setNeverDisplayInline( true );
+ return false;
+ }
+ static const KMail::BodyPartFormatter * create() {
+ if ( !self )
+ self = new AnyTypeBodyPartFormatter();
+ return self;
+ }
+ };
+
+ const AnyTypeBodyPartFormatter * AnyTypeBodyPartFormatter::self = 0;
+
+
+ class ImageTypeBodyPartFormatter : public KMail::BodyPartFormatter {
+ static const ImageTypeBodyPartFormatter * self;
+ public:
+ bool process( KMail::ObjectTreeParser *, partNode *, KMail::ProcessResult & result ) const {
+ result.setIsImage( true );
+ return false;
+ }
+ static const KMail::BodyPartFormatter * create() {
+ if ( !self )
+ self = new ImageTypeBodyPartFormatter();
+ return self;
+ }
+ };
+
+ const ImageTypeBodyPartFormatter * ImageTypeBodyPartFormatter::self = 0;
+
+#define CREATE_BODY_PART_FORMATTER(subtype) \
+ class subtype##BodyPartFormatter : public KMail::BodyPartFormatter { \
+ static const subtype##BodyPartFormatter * self; \
+ public: \
+ bool process( KMail::ObjectTreeParser *, partNode *, KMail::ProcessResult & ) const; \
+ static const KMail::BodyPartFormatter * create() { \
+ if ( !self ) \
+ self = new subtype##BodyPartFormatter(); \
+ return self; \
+ } \
+ }; \
+ \
+ const subtype##BodyPartFormatter * subtype##BodyPartFormatter::self; \
+ \
+ bool subtype##BodyPartFormatter::process( KMail::ObjectTreeParser * otp, partNode * node, KMail::ProcessResult & result ) const { \
+ return otp->process##subtype##Subtype( node, result ); \
+ }
+
+ CREATE_BODY_PART_FORMATTER(TextPlain)
+ CREATE_BODY_PART_FORMATTER(TextHtml)
+ //CREATE_BODY_PART_FORMATTER(TextEnriched)
+
+ CREATE_BODY_PART_FORMATTER(ApplicationOctetStream)
+ CREATE_BODY_PART_FORMATTER(ApplicationPkcs7Mime)
+ CREATE_BODY_PART_FORMATTER(ApplicationChiasmusText)
+ //CREATE_BODY_PART_FORMATTER(ApplicationPgp)
+ CREATE_BODY_PART_FORMATTER(ApplicationMsTnef)
+
+ CREATE_BODY_PART_FORMATTER(MessageRfc822)
+
+ CREATE_BODY_PART_FORMATTER(MultiPartMixed)
+ CREATE_BODY_PART_FORMATTER(MultiPartAlternative)
+ CREATE_BODY_PART_FORMATTER(MultiPartSigned)
+ CREATE_BODY_PART_FORMATTER(MultiPartEncrypted)
+
+ typedef TextPlainBodyPartFormatter ApplicationPgpBodyPartFormatter;
+
+
+#undef CREATE_BODY_PART_FORMATTER
+} // anon namespace
+
+// FIXME: port some more KMail::BodyPartFormatters to KMail::Interface::BodyPartFormatters
+void KMail::BodyPartFormatterFactoryPrivate::kmail_create_builtin_bodypart_formatters( KMail::BodyPartFormatterFactoryPrivate::TypeRegistry * reg ) {
+ if ( !reg ) return;
+ (*reg)["application"]["octet-stream"] = new AnyTypeBodyPartFormatter();
+}
+
+typedef const KMail::BodyPartFormatter * (*BodyPartFormatterCreator)();
+
+struct SubtypeBuiltin {
+ const char * subtype;
+ BodyPartFormatterCreator create;
+};
+
+static const SubtypeBuiltin applicationSubtypeBuiltins[] = {
+ { "octet-stream", &ApplicationOctetStreamBodyPartFormatter::create },
+ { "pkcs7-mime", &ApplicationPkcs7MimeBodyPartFormatter::create },
+ { "x-pkcs7-mime", &ApplicationPkcs7MimeBodyPartFormatter::create },
+ { "vnd.de.bund.bsi.chiasmus-text", &ApplicationChiasmusTextBodyPartFormatter::create },
+ { "pgp", &ApplicationPgpBodyPartFormatter::create },
+ { "ms-tnef", &ApplicationMsTnefBodyPartFormatter::create }
+};
+
+static const SubtypeBuiltin textSubtypeBuiltins[] = {
+ { "html", &TextHtmlBodyPartFormatter::create },
+ //{ "enriched", &TextEnrichedBodyPartFormatter::create },
+ { "x-vcard", &AnyTypeBodyPartFormatter::create },
+ { "vcard", &AnyTypeBodyPartFormatter::create },
+ { "rtf", &AnyTypeBodyPartFormatter::create },
+ { "*", &TextPlainBodyPartFormatter::create },
+};
+
+static const SubtypeBuiltin multipartSubtypeBuiltins[] = {
+ { "mixed", &MultiPartMixedBodyPartFormatter::create },
+ { "alternative", &MultiPartAlternativeBodyPartFormatter::create },
+ //{ "digest", &MultiPartDigestFormatter::create },
+ //{ "parallel", &MultiPartParallelFormatter::create },
+ //{ "related", &MultiPartRelatedFormatter::create },
+ { "signed", &MultiPartSignedBodyPartFormatter::create },
+ { "encrypted", &MultiPartEncryptedBodyPartFormatter::create },
+ //{ "report", &MultiPartReportFormatter::create },
+};
+
+static const SubtypeBuiltin messageSubtypeBuiltins[] = {
+ { "rfc822", &MessageRfc822BodyPartFormatter::create },
+};
+
+static const SubtypeBuiltin imageSubtypeBuiltins[] = {
+ { "*", &ImageTypeBodyPartFormatter::create },
+};
+
+static const SubtypeBuiltin anySubtypeBuiltins[] = {
+ { "*", &AnyTypeBodyPartFormatter::create },
+};
+
+#ifdef DIM
+#undef DIM
+#endif
+#define DIM(x) sizeof(x) / sizeof(*x)
+
+static const struct {
+ const char * type;
+ const SubtypeBuiltin * subtypes;
+ unsigned int num_subtypes;
+} builtins[] = {
+ { "application", applicationSubtypeBuiltins, DIM(applicationSubtypeBuiltins) },
+ { "text", textSubtypeBuiltins, DIM(textSubtypeBuiltins) },
+ { "multipart", multipartSubtypeBuiltins, DIM(multipartSubtypeBuiltins) },
+ { "message", messageSubtypeBuiltins, DIM(messageSubtypeBuiltins) },
+ { "image", imageSubtypeBuiltins, DIM(imageSubtypeBuiltins) },
+ //{ "audio", audioSubtypeBuiltins, DIM(audioSubtypeBuiltins) },
+ //{ "model", modelSubtypeBuiltins, DIM(modelSubtypeBuiltins) },
+ //{ "video", videoSubtypeBuiltins, DIM(videoSubtypeBuiltins) },
+ { "*", anySubtypeBuiltins, DIM(anySubtypeBuiltins) },
+};
+
+#undef DIM
+
+const KMail::BodyPartFormatter * KMail::BodyPartFormatter::createFor( int type, int subtype ) {
+ DwString t, st;
+ DwTypeEnumToStr( type, t );
+ DwSubtypeEnumToStr( subtype, st );
+ return createFor( t.c_str(), st.c_str() );
+}
+
+static const KMail::BodyPartFormatter * createForText( const char * subtype ) {
+ if ( subtype && *subtype )
+ switch ( subtype[0] ) {
+ case 'h':
+ case 'H':
+ if ( kasciistricmp( subtype, "html" ) == 0 )
+ return TextHtmlBodyPartFormatter::create();
+ break;
+ case 'r':
+ case 'R':
+ if ( kasciistricmp( subtype, "rtf" ) == 0 )
+ return AnyTypeBodyPartFormatter::create();
+ break;
+ case 'x':
+ case 'X':
+ case 'v':
+ case 'V':
+ if ( kasciistricmp( subtype, "x-vcard" ) == 0 ||
+ kasciistricmp( subtype, "vcard" ) == 0 )
+ return AnyTypeBodyPartFormatter::create();
+ break;
+ }
+
+ return TextPlainBodyPartFormatter::create();
+}
+
+static const KMail::BodyPartFormatter * createForImage( const char * ) {
+ return ImageTypeBodyPartFormatter::create();
+}
+
+static const KMail::BodyPartFormatter * createForMessage( const char * subtype ) {
+ if ( kasciistricmp( subtype, "rfc822" ) == 0 )
+ return MessageRfc822BodyPartFormatter::create();
+ return AnyTypeBodyPartFormatter::create();
+}
+
+static const KMail::BodyPartFormatter * createForMultiPart( const char * subtype ) {
+ if ( subtype && *subtype )
+ switch ( subtype[0] ) {
+ case 'a':
+ case 'A':
+ if ( kasciistricmp( subtype, "alternative" ) == 0 )
+ return MultiPartAlternativeBodyPartFormatter::create();
+ break;
+ case 'e':
+ case 'E':
+ if ( kasciistricmp( subtype, "encrypted" ) == 0 )
+ return MultiPartEncryptedBodyPartFormatter::create();
+ break;
+ case 's':
+ case 'S':
+ if ( kasciistricmp( subtype, "signed" ) == 0 )
+ return MultiPartSignedBodyPartFormatter::create();
+ break;
+ }
+
+ return MultiPartMixedBodyPartFormatter::create();
+}
+
+static const KMail::BodyPartFormatter * createForApplication( const char * subtype ) {
+ if ( subtype && *subtype )
+ switch ( subtype[0] ) {
+ case 'p':
+ case 'P':
+ if ( kasciistricmp( subtype, "pgp" ) == 0 )
+ return ApplicationPgpBodyPartFormatter::create();
+ // fall through
+ case 'x':
+ case 'X':
+ if ( kasciistricmp( subtype, "pkcs7-mime" ) == 0 ||
+ kasciistricmp( subtype, "x-pkcs7-mime" ) == 0 )
+ return ApplicationPkcs7MimeBodyPartFormatter::create();
+ break;
+ case 'm':
+ case 'M':
+ if ( kasciistricmp( subtype, "ms-tnef" ) == 0 )
+ return ApplicationMsTnefBodyPartFormatter::create();
+ break;
+ case 'v':
+ case 'V':
+ if ( kasciistricmp( subtype, "vnd.de.bund.bsi.chiasmus-text") == 0)
+ return ApplicationChiasmusTextBodyPartFormatter::create();
+ break;
+ }
+
+ return AnyTypeBodyPartFormatter::create();
+}
+
+// OK, replace this with a factory with plugin support later on...
+const KMail::BodyPartFormatter * KMail::BodyPartFormatter::createFor( const char * type, const char * subtype ) {
+ if ( type && *type )
+ switch ( type[0] ) {
+ case 'a': // application
+ case 'A':
+ if ( kasciistricmp( type, "application" ) == 0 )
+ return createForApplication( subtype );
+ break;
+ case 'i': // image
+ case 'I':
+ if ( kasciistricmp( type, "image" ) == 0 )
+ return createForImage( subtype );
+ break;
+ case 'm': // multipart / message
+ case 'M':
+ if ( kasciistricmp( type, "multipart" ) == 0 )
+ return createForMultiPart( subtype );
+ else if ( kasciistricmp( type, "message" ) == 0 )
+ return createForMessage( subtype );
+ break;
+ case 't': // text
+ case 'T':
+ if ( kasciistricmp( type, "text" ) == 0 )
+ return createForText( subtype );
+ break;
+ }
+
+ return AnyTypeBodyPartFormatter::create();
+}
+