2007-09-03 [colin] 3.0.0cvs2
authorColin Leroy <colin@colino.net>
Mon, 3 Sep 2007 06:29:51 +0000 (06:29 +0000)
committerColin Leroy <colin@colino.net>
Mon, 3 Sep 2007 06:29:51 +0000 (06:29 +0000)
* 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.

ChangeLog
PATCHSETS
configure.ac
src/common/plugin.c
src/common/plugin.h
src/procmime.c
src/procmime.h

index 6fde1c9f8dc5010ec744d6901808802fd71896c0..3fdc00d002737608ee34ec15c7bb044023584d0a 100644 (file)
--- 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
index d1ca7ca71f06aeff0065fc898273c86d96b8531c..4f64b8f3ee179fe191c8114025057c34eb322df0 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( 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
index 81c8cc025f3a7c817e9a73f998cc46ae5ce9dcb9..a8647ed70c240361eab277ae049ba860d81b56e2 100644 (file)
@@ -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=
 
index 4054718d85f117f6824b0e4e5a0ca4cebc801b91..ae72652433429d1ab839e14a6b1eada79dbc80c8 100644 (file)
@@ -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"),
index 7beb4cebdd79cb81f576234691158100632bfed9..0cfc16c0fe386d0d24209f63824a21a82cf7cb37 100644 (file)
@@ -27,6 +27,7 @@ typedef struct _Plugin Plugin;
 typedef enum {
        PLUGIN_NOTHING,
        PLUGIN_MIMEVIEWER,
+       PLUGIN_MIMEPARSER,
        PLUGIN_FOLDERCLASS,
        PLUGIN_FILTERING,
        PLUGIN_PRIVACY,
index 85fa87137e04f7c859d943ec4bfae41c37b4d374..1d98419f13c0490cb5f951fd6b92855302dcaa7d 100644 (file)
@@ -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;
index ccf92609584f98bdf7ceed15e619db018119cc54..e045b736fd81307009b5598f2aebda0c31ac81d7 100644 (file)
@@ -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 */