static void gimp_plug_in_manager_add_from_file (const GimpDatafileData *file_data, gpointer data) { GimpPlugInManager *manager = data; GimpPlugInDef *plug_in_def; GFile *file; GSList *list; /* When we scan build dirs for plug-ins, there will be some * executable files that are not plug-ins that we want to ignore, * for example plug-ins/common/mkgen.pl if * GIMP_TESTING_PLUGINDIRS=plug-ins/common */ if (gimp_plug_in_manager_ignore_plugin_basename (file_data->basename)) return; for (list = manager->plug_in_defs; list; list = list->next) { gchar *path; gchar *plug_in_name; plug_in_def = list->data; path = g_file_get_path (plug_in_def->file); plug_in_name = g_path_get_basename (path); g_free (path); if (g_ascii_strcasecmp (file_data->basename, plug_in_name) == 0) { g_printerr ("Skipping duplicate plug-in: '%s'\n", gimp_filename_to_utf8 (file_data->filename)); g_free (plug_in_name); return; } g_free (plug_in_name); } file = g_file_new_for_path (file_data->filename); plug_in_def = gimp_plug_in_def_new (file); g_object_unref (file); gimp_plug_in_def_set_mtime (plug_in_def, file_data->mtime); gimp_plug_in_def_set_needs_query (plug_in_def, TRUE); manager->plug_in_defs = g_slist_prepend (manager->plug_in_defs, plug_in_def); }
static GTokenType plug_in_def_deserialize (Gimp *gimp, GScanner *scanner, GSList **plug_in_defs) { GimpPlugInDef *plug_in_def; GimpPlugInProcedure *proc = NULL; gchar *name; gchar *path; GFile *file; gint64 mtime; GTokenType token; if (! gimp_scanner_parse_string (scanner, &name)) return G_TOKEN_STRING; path = gimp_config_path_expand (name, TRUE, NULL); g_free (name); file = g_file_new_for_path (path); g_free (path); plug_in_def = gimp_plug_in_def_new (file); g_object_unref (file); if (! gimp_scanner_parse_int64 (scanner, &mtime)) { g_object_unref (plug_in_def); return G_TOKEN_INT; } plug_in_def->mtime = mtime; token = G_TOKEN_LEFT_PAREN; while (g_scanner_peek_next_token (scanner) == token) { token = g_scanner_get_next_token (scanner); switch (token) { case G_TOKEN_LEFT_PAREN: token = G_TOKEN_SYMBOL; break; case G_TOKEN_SYMBOL: switch (GPOINTER_TO_INT (scanner->value.v_symbol)) { case PROC_DEF: token = plug_in_procedure_deserialize (scanner, gimp, plug_in_def->file, &proc); if (token == G_TOKEN_LEFT_PAREN) gimp_plug_in_def_add_procedure (plug_in_def, proc); if (proc) g_object_unref (proc); break; case LOCALE_DEF: token = plug_in_locale_def_deserialize (scanner, plug_in_def); break; case HELP_DEF: token = plug_in_help_def_deserialize (scanner, plug_in_def); break; case HAS_INIT: token = plug_in_has_init_deserialize (scanner, plug_in_def); break; default: break; } break; case G_TOKEN_RIGHT_PAREN: token = G_TOKEN_LEFT_PAREN; break; default: break; } } if (token == G_TOKEN_LEFT_PAREN) { token = G_TOKEN_RIGHT_PAREN; if (gimp_scanner_parse_token (scanner, token)) { *plug_in_defs = g_slist_prepend (*plug_in_defs, plug_in_def); return G_TOKEN_LEFT_PAREN; } } g_object_unref (plug_in_def); return token; }