+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);
+}
+