From: Colin Leroy Date: Mon, 3 Sep 2007 06:29:51 +0000 (+0000) Subject: 2007-09-03 [colin] 3.0.0cvs2 X-Git-Tag: rel_3_1_0~228 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=d9ed3ee7231d627fcb41e208df17c820c180ce9c 2007-09-03 [colin] 3.0.0cvs2 * src/procmime.c * src/procmime.h * src/common/plugin.c * src/common/plugin.h Add a new plugin API, MimeParser. It allows plugins to scan email MIME parts and optionally, transform them. --- diff --git a/ChangeLog b/ChangeLog index 6fde1c9f8..3fdc00d00 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2007-09-03 [colin] 3.0.0cvs2 + + * src/procmime.c + * src/procmime.h + * src/common/plugin.c + * src/common/plugin.h + Add a new plugin API, MimeParser. It allows + plugins to scan email MIME parts and optionally, + transform them. + 2007-09-03 [mones] 3.0.0cvs1 * po/es.po diff --git a/PATCHSETS b/PATCHSETS index d1ca7ca71..4f64b8f3e 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -2847,3 +2847,4 @@ ( cvs diff -u -r 1.1.2.5 -r 1.1.2.6 src/edittags.c; cvs diff -u -r 1.1.2.2 -r 1.1.2.3 src/common/tags.c; ) > 2.10.0cvs190.patchset ( cvs diff -u -r 1.21.2.5 -r 1.21.2.6 po/bg.po; cvs diff -u -r 1.1.2.13 -r 1.1.2.14 po/ca.po; cvs diff -u -r 1.58.2.32 -r 1.58.2.33 po/de.po; cvs diff -u -r 1.1.2.14 -r 1.1.2.15 po/fi.po; cvs diff -u -r 1.42.2.32 -r 1.42.2.33 po/fr.po; cvs diff -u -r 1.5.2.6 -r 1.5.2.7 po/hu.po; cvs diff -u -r 1.34.2.22 -r 1.34.2.23 po/it.po; cvs diff -u -r 1.10.2.13 -r 1.10.2.14 po/pl.po; cvs diff -u -r 1.50.2.26 -r 1.50.2.27 po/pt_BR.po; cvs diff -u -r 1.17.2.15 -r 1.17.2.16 po/ru.po; cvs diff -u -r 1.2.2.25 -r 1.2.2.26 po/sk.po; cvs diff -u -r 1.5.2.24 -r 1.5.2.25 po/zh_CN.po; ) > 2.10.0cvs191.patchset ( cvs diff -u -r 1.60.2.45 -r 1.60.2.46 po/es.po; cvs diff -u -r 1.9.2.41 -r 1.9.2.42 src/common/defs.h; ) > 3.0.0cvs1.patchset +( cvs diff -u -r 1.49.2.96 -r 1.49.2.97 src/procmime.c; cvs diff -u -r 1.17.2.19 -r 1.17.2.20 src/procmime.h; cvs diff -u -r 1.13.2.29 -r 1.13.2.30 src/common/plugin.c; cvs diff -u -r 1.5.2.12 -r 1.5.2.13 src/common/plugin.h; ) > 3.0.0cvs2.patchset diff --git a/configure.ac b/configure.ac index 81c8cc025..a8647ed70 100644 --- a/configure.ac +++ b/configure.ac @@ -11,7 +11,7 @@ MINOR_VERSION=0 MICRO_VERSION=0 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=1 +EXTRA_VERSION=2 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/common/plugin.c b/src/common/plugin.c index 4054718d8..ae7265243 100644 --- a/src/common/plugin.c +++ b/src/common/plugin.c @@ -55,6 +55,7 @@ struct _Plugin const gchar *plugin_feature_names[] = { N_("Nothing"), N_("a viewer"), + N_("a MIME parser"), N_("folders"), N_("filtering"), N_("a privacy interface"), diff --git a/src/common/plugin.h b/src/common/plugin.h index 7beb4cebd..0cfc16c0f 100644 --- a/src/common/plugin.h +++ b/src/common/plugin.h @@ -27,6 +27,7 @@ typedef struct _Plugin Plugin; typedef enum { PLUGIN_NOTHING, PLUGIN_MIMEVIEWER, + PLUGIN_MIMEPARSER, PLUGIN_FOLDERCLASS, PLUGIN_FILTERING, PLUGIN_PRIVACY, diff --git a/src/procmime.c b/src/procmime.c index 85fa87137..1d98419f1 100644 --- a/src/procmime.c +++ b/src/procmime.c @@ -1783,6 +1783,37 @@ static void procmime_parse_content_encoding(const gchar *content_encoding, MimeI return; } +static GSList *registered_parsers = NULL; + +static MimeParser *procmime_get_mimeparser_for_type(MimeMediaType type, const gchar *sub_type) +{ + GSList *cur; + for (cur = registered_parsers; cur; cur = cur->next) { + MimeParser *parser = (MimeParser *)cur->data; + if (parser->type == type && !strcmp2(parser->sub_type, sub_type)) + return parser; + } + return NULL; +} + +void procmime_mimeparser_register(MimeParser *parser) +{ + if (!procmime_get_mimeparser_for_type(parser->type, parser->sub_type)) + registered_parsers = g_slist_append(registered_parsers, parser); +} + + +void procmime_mimeparser_unregister(MimeParser *parser) +{ + registered_parsers = g_slist_remove(registered_parsers, parser); +} + +static gboolean procmime_mimeparser_parse(MimeParser *parser, MimeInfo *mimeinfo) +{ + g_return_val_if_fail(parser->parse != NULL, FALSE); + return parser->parse(parser, mimeinfo); +} + static int procmime_parse_mimepart(MimeInfo *parent, gchar *content_type, gchar *content_encoding, @@ -1796,7 +1827,10 @@ static int procmime_parse_mimepart(MimeInfo *parent, gboolean short_scan) { MimeInfo *mimeinfo; + MimeParser *parser = NULL; + gboolean parsed = FALSE; int result = 0; + /* Create MimeInfo */ mimeinfo = procmime_mimeinfo_new(); mimeinfo->content = MIMECONTENT_FILE; @@ -1856,7 +1890,11 @@ static int procmime_parse_mimepart(MimeInfo *parent, mimeinfo->disposition = DISPOSITIONTYPE_UNKNOWN; /* Call parser for mime type */ - switch (mimeinfo->type) { + if ((parser = procmime_get_mimeparser_for_type(mimeinfo->type, mimeinfo->subtype)) != NULL) { + parsed = procmime_mimeparser_parse(parser, mimeinfo); + } + if (!parsed) { + switch (mimeinfo->type) { case MIMETYPE_TEXT: if (g_ascii_strcasecmp(mimeinfo->subtype, "plain") == 0 && short_scan) { return 1; @@ -1875,6 +1913,7 @@ static int procmime_parse_mimepart(MimeInfo *parent, default: break; + } } return result; diff --git a/src/procmime.h b/src/procmime.h index ccf926095..e045b736f 100644 --- a/src/procmime.h +++ b/src/procmime.h @@ -26,6 +26,7 @@ typedef struct _MimeType MimeType; typedef struct _MimeInfo MimeInfo; +typedef struct _MimeParser MimeParser; #include "procmsg.h" #include "utils.h" @@ -81,6 +82,14 @@ struct _MimeType gchar *extension; }; +struct _MimeParser +{ + MimeMediaType type; + const gchar *sub_type; + + gboolean (*parse)(MimeParser *parser, MimeInfo *mimeinfo); +}; + /* * An example of MimeInfo structure: * @@ -229,6 +238,9 @@ void renderer_write_config(void); gint procmime_write_mimeinfo(MimeInfo *mimeinfo, FILE *fp); +void procmime_mimeparser_register(MimeParser *mimeparser); +void procmime_mimeparser_unregister(MimeParser *mimeparser); + #ifdef __cplusplus } #endif /* __cplusplus */