app/core/gimpmoduleinfo.[ch] separated module query from type registration

2002-10-20  Michael Natterer  <mitch@gimp.org>

	* app/core/gimpmoduleinfo.[ch]
	* libgimp/gimpmodule.h: separated module query from type
	registration by adding a separate "gimp_module_query" function
	which must be implemented by modules. Make local copies of the
	strings returned by the query function.

	* app/core/gimpmodules.c
	* app/gui/module-browser.c: changed accordingly.

	* modules/cdisplay_gamma.c
	* modules/cdisplay_highcontrast.c
	* modules/colorsel_triangle.c
	* modules/colorsel_water.c: added the gimp_module_query() functions.
This commit is contained in:
Michael Natterer 2002-10-20 12:40:30 +00:00 committed by Michael Natterer
parent 079b768ea7
commit 4cb04533e4
15 changed files with 229 additions and 103 deletions

View File

@ -1,3 +1,19 @@
2002-10-20 Michael Natterer <mitch@gimp.org>
* app/core/gimpmoduleinfo.[ch]
* libgimp/gimpmodule.h: separated module query from type
registration by adding a separate "gimp_module_query" function
which must be implemented by modules. Make local copies of the
strings returned by the query function.
* app/core/gimpmodules.c
* app/gui/module-browser.c: changed accordingly.
* modules/cdisplay_gamma.c
* modules/cdisplay_highcontrast.c
* modules/colorsel_triangle.c
* modules/colorsel_water.c: added the gimp_module_query() functions.
2002-10-20 Michael Natterer <mitch@gimp.org> 2002-10-20 Michael Natterer <mitch@gimp.org>
* app/display/gimpdisplayshell-filter.[ch]: removed the * app/display/gimpdisplayshell-filter.[ch]: removed the

View File

@ -286,23 +286,23 @@ print_module_info (gpointer data,
g_print ("\n%s: %i\n", g_print ("\n%s: %i\n",
i->filename, i->filename,
i->state /* statename[i->state] */); i->state /* statename[i->state] */);
g_print (" module:%p lasterr:%s register:%p\n",
g_print (" module:%p lasterr:%s query:%p register:%p\n",
i->module, i->module,
i->last_module_error? i->last_module_error : "NONE", i->last_module_error ? i->last_module_error : "NONE",
i->query_module,
i->register_module); i->register_module);
if (i->info)
{
g_print (" purpose: %s\n" g_print (" purpose: %s\n"
" author: %s\n" " author: %s\n"
" version: %s\n" " version: %s\n"
" copyright: %s\n" " copyright: %s\n"
" date: %s\n", " date: %s\n",
i->info->purpose, i->info.purpose ? i->info.purpose : "NONE",
i->info->author, i->info.author ? i->info.author : "NONE",
i->info->version, i->info.version ? i->info.version : "NONE",
i->info->copyright, i->info.copyright ? i->info.copyright : "NONE",
i->info->date); i->info.date ? i->info.date : "NONE");
}
} }
#endif #endif

View File

@ -125,7 +125,6 @@ gimp_module_info_init (GimpModuleInfoObj *module_info)
module_info->load_inhibit = FALSE; module_info->load_inhibit = FALSE;
module_info->module = NULL; module_info->module = NULL;
module_info->info = NULL;
module_info->last_module_error = NULL; module_info->last_module_error = NULL;
module_info->register_module = NULL; module_info->register_module = NULL;
@ -157,6 +156,7 @@ static gboolean
gimp_module_info_load (GTypeModule *module) gimp_module_info_load (GTypeModule *module)
{ {
GimpModuleInfoObj *module_info; GimpModuleInfoObj *module_info;
const GimpModuleInfo *info;
gpointer symbol; gpointer symbol;
gboolean retval; gboolean retval;
@ -184,7 +184,58 @@ gimp_module_info_load (GTypeModule *module)
return FALSE; return FALSE;
} }
/* find the module_init symbol */ /* find the gimp_module_query symbol */
if (! g_module_symbol (module_info->module, "gimp_module_query", &symbol))
{
module_info->state = GIMP_MODULE_STATE_ERROR;
gimp_module_info_set_last_error (module_info,
_("Missing gimp_module_query() symbol"));
if (module_info->verbose)
g_message (_("Module '%s' load error:\n%s"),
module_info->filename, module_info->last_module_error);
g_module_close (module_info->module);
module_info->module = NULL;
return FALSE;
}
module_info->query_module = symbol;
info = module_info->query_module (module);
if (! info)
{
module_info->state = GIMP_MODULE_STATE_ERROR;
gimp_module_info_set_last_error (module_info,
_("gimp_module_query() returned NULL"));
if (module_info->verbose)
g_message (_("Module '%s' load error:\n%s"),
module_info->filename, module_info->last_module_error);
g_module_close (module_info->module);
module_info->module = NULL;
module_info->query_module = NULL;
return FALSE;
}
g_free ((gchar *) module_info->info.purpose);
module_info->info.purpose = g_strdup (info->purpose);
g_free ((gchar *) module_info->info.author);
module_info->info.author = g_strdup (info->author);
g_free ((gchar *) module_info->info.version);
module_info->info.version = g_strdup (info->version);
g_free ((gchar *) module_info->info.copyright);
module_info->info.copyright = g_strdup (info->copyright);
g_free ((gchar *) module_info->info.date);
module_info->info.date = g_strdup (info->date);
/* find the gimp_module_register symbol */
if (! g_module_symbol (module_info->module, "gimp_module_register", &symbol)) if (! g_module_symbol (module_info->module, "gimp_module_register", &symbol))
{ {
module_info->state = GIMP_MODULE_STATE_ERROR; module_info->state = GIMP_MODULE_STATE_ERROR;
@ -202,7 +253,7 @@ gimp_module_info_load (GTypeModule *module)
module_info->register_module = symbol; module_info->register_module = symbol;
retval = module_info->register_module (module, &module_info->info); retval = module_info->register_module (module);
if (retval) if (retval)
module_info->state = GIMP_MODULE_STATE_LOADED_OK; module_info->state = GIMP_MODULE_STATE_LOADED_OK;
@ -225,7 +276,7 @@ gimp_module_info_unload (GTypeModule *module)
g_module_close (module_info->module); /* FIXME: error handling */ g_module_close (module_info->module); /* FIXME: error handling */
module_info->module = NULL; module_info->module = NULL;
module_info->info = NULL; module_info->query_module = NULL;
module_info->register_module = NULL; module_info->register_module = NULL;
module_info->state = GIMP_MODULE_STATE_UNLOADED_OK; module_info->state = GIMP_MODULE_STATE_UNLOADED_OK;

View File

@ -58,11 +58,11 @@ struct _GimpModuleInfoObj
/* stuff from now on may be NULL depending on the state the module is in */ /* stuff from now on may be NULL depending on the state the module is in */
GModule *module; /* handle on the module */ GModule *module; /* handle on the module */
GimpModuleInfo *info; /* returned values from module_register */ GimpModuleInfo info; /* returned values from module_query */
gchar *last_module_error; gchar *last_module_error;
gboolean (* register_module) (GTypeModule *module, const GimpModuleInfo * (* query_module) (GTypeModule *module);
GimpModuleInfo **module_info); gboolean (* register_module) (GTypeModule *module);
}; };
struct _GimpModuleInfoObjClass struct _GimpModuleInfoObjClass

View File

@ -286,23 +286,23 @@ print_module_info (gpointer data,
g_print ("\n%s: %i\n", g_print ("\n%s: %i\n",
i->filename, i->filename,
i->state /* statename[i->state] */); i->state /* statename[i->state] */);
g_print (" module:%p lasterr:%s register:%p\n",
g_print (" module:%p lasterr:%s query:%p register:%p\n",
i->module, i->module,
i->last_module_error? i->last_module_error : "NONE", i->last_module_error ? i->last_module_error : "NONE",
i->query_module,
i->register_module); i->register_module);
if (i->info)
{
g_print (" purpose: %s\n" g_print (" purpose: %s\n"
" author: %s\n" " author: %s\n"
" version: %s\n" " version: %s\n"
" copyright: %s\n" " copyright: %s\n"
" date: %s\n", " date: %s\n",
i->info->purpose, i->info.purpose ? i->info.purpose : "NONE",
i->info->author, i->info.author ? i->info.author : "NONE",
i->info->version, i->info.version ? i->info.version : "NONE",
i->info->copyright, i->info.copyright ? i->info.copyright : "NONE",
i->info->date); i->info.date ? i->info.date : "NONE");
}
} }
#endif #endif

View File

@ -386,13 +386,13 @@ browser_info_update (GimpModuleInfoObj *mod,
return; return;
} }
if (mod->info) if (mod->info.purpose)
{ {
text[0] = mod->info->purpose; text[0] = mod->info.purpose;
text[1] = mod->info->author; text[1] = mod->info.author;
text[2] = mod->info->version; text[2] = mod->info.version;
text[3] = mod->info->copyright; text[3] = mod->info.copyright;
text[4] = mod->info->date; text[4] = mod->info.date;
text[5] = mod->on_disk ? _("On disk") : _("Only in memory"); text[5] = mod->on_disk ? _("On disk") : _("Only in memory");
} }
else else

View File

@ -386,13 +386,13 @@ browser_info_update (GimpModuleInfoObj *mod,
return; return;
} }
if (mod->info) if (mod->info.purpose)
{ {
text[0] = mod->info->purpose; text[0] = mod->info.purpose;
text[1] = mod->info->author; text[1] = mod->info.author;
text[2] = mod->info->version; text[2] = mod->info.version;
text[3] = mod->info->copyright; text[3] = mod->info.copyright;
text[4] = mod->info->date; text[4] = mod->info.date;
text[5] = mod->on_disk ? _("On disk") : _("Only in memory"); text[5] = mod->on_disk ? _("On disk") : _("Only in memory");
} }
else else

View File

@ -40,8 +40,8 @@ struct _GimpModuleInfo
}; };
typedef gboolean (* GimpModuleRegisterFunc) (GTypeModule *module, typedef const GimpModuleInfo * (* GimpModuleQueryFunc) (GTypeModule *module);
GimpModuleInfo **module_info); typedef gboolean (* GimpModuleRegisterFunc) (GTypeModule *module);
G_END_DECLS G_END_DECLS

View File

@ -125,7 +125,6 @@ gimp_module_info_init (GimpModuleInfoObj *module_info)
module_info->load_inhibit = FALSE; module_info->load_inhibit = FALSE;
module_info->module = NULL; module_info->module = NULL;
module_info->info = NULL;
module_info->last_module_error = NULL; module_info->last_module_error = NULL;
module_info->register_module = NULL; module_info->register_module = NULL;
@ -157,6 +156,7 @@ static gboolean
gimp_module_info_load (GTypeModule *module) gimp_module_info_load (GTypeModule *module)
{ {
GimpModuleInfoObj *module_info; GimpModuleInfoObj *module_info;
const GimpModuleInfo *info;
gpointer symbol; gpointer symbol;
gboolean retval; gboolean retval;
@ -184,7 +184,58 @@ gimp_module_info_load (GTypeModule *module)
return FALSE; return FALSE;
} }
/* find the module_init symbol */ /* find the gimp_module_query symbol */
if (! g_module_symbol (module_info->module, "gimp_module_query", &symbol))
{
module_info->state = GIMP_MODULE_STATE_ERROR;
gimp_module_info_set_last_error (module_info,
_("Missing gimp_module_query() symbol"));
if (module_info->verbose)
g_message (_("Module '%s' load error:\n%s"),
module_info->filename, module_info->last_module_error);
g_module_close (module_info->module);
module_info->module = NULL;
return FALSE;
}
module_info->query_module = symbol;
info = module_info->query_module (module);
if (! info)
{
module_info->state = GIMP_MODULE_STATE_ERROR;
gimp_module_info_set_last_error (module_info,
_("gimp_module_query() returned NULL"));
if (module_info->verbose)
g_message (_("Module '%s' load error:\n%s"),
module_info->filename, module_info->last_module_error);
g_module_close (module_info->module);
module_info->module = NULL;
module_info->query_module = NULL;
return FALSE;
}
g_free ((gchar *) module_info->info.purpose);
module_info->info.purpose = g_strdup (info->purpose);
g_free ((gchar *) module_info->info.author);
module_info->info.author = g_strdup (info->author);
g_free ((gchar *) module_info->info.version);
module_info->info.version = g_strdup (info->version);
g_free ((gchar *) module_info->info.copyright);
module_info->info.copyright = g_strdup (info->copyright);
g_free ((gchar *) module_info->info.date);
module_info->info.date = g_strdup (info->date);
/* find the gimp_module_register symbol */
if (! g_module_symbol (module_info->module, "gimp_module_register", &symbol)) if (! g_module_symbol (module_info->module, "gimp_module_register", &symbol))
{ {
module_info->state = GIMP_MODULE_STATE_ERROR; module_info->state = GIMP_MODULE_STATE_ERROR;
@ -202,7 +253,7 @@ gimp_module_info_load (GTypeModule *module)
module_info->register_module = symbol; module_info->register_module = symbol;
retval = module_info->register_module (module, &module_info->info); retval = module_info->register_module (module);
if (retval) if (retval)
module_info->state = GIMP_MODULE_STATE_LOADED_OK; module_info->state = GIMP_MODULE_STATE_LOADED_OK;
@ -225,7 +276,7 @@ gimp_module_info_unload (GTypeModule *module)
g_module_close (module_info->module); /* FIXME: error handling */ g_module_close (module_info->module); /* FIXME: error handling */
module_info->module = NULL; module_info->module = NULL;
module_info->info = NULL; module_info->query_module = NULL;
module_info->register_module = NULL; module_info->register_module = NULL;
module_info->state = GIMP_MODULE_STATE_UNLOADED_OK; module_info->state = GIMP_MODULE_STATE_UNLOADED_OK;

View File

@ -58,11 +58,11 @@ struct _GimpModuleInfoObj
/* stuff from now on may be NULL depending on the state the module is in */ /* stuff from now on may be NULL depending on the state the module is in */
GModule *module; /* handle on the module */ GModule *module; /* handle on the module */
GimpModuleInfo *info; /* returned values from module_register */ GimpModuleInfo info; /* returned values from module_query */
gchar *last_module_error; gchar *last_module_error;
gboolean (* register_module) (GTypeModule *module, const GimpModuleInfo * (* query_module) (GTypeModule *module);
GimpModuleInfo **module_info); gboolean (* register_module) (GTypeModule *module);
}; };
struct _GimpModuleInfoObjClass struct _GimpModuleInfoObjClass

View File

@ -286,23 +286,23 @@ print_module_info (gpointer data,
g_print ("\n%s: %i\n", g_print ("\n%s: %i\n",
i->filename, i->filename,
i->state /* statename[i->state] */); i->state /* statename[i->state] */);
g_print (" module:%p lasterr:%s register:%p\n",
g_print (" module:%p lasterr:%s query:%p register:%p\n",
i->module, i->module,
i->last_module_error? i->last_module_error : "NONE", i->last_module_error ? i->last_module_error : "NONE",
i->query_module,
i->register_module); i->register_module);
if (i->info)
{
g_print (" purpose: %s\n" g_print (" purpose: %s\n"
" author: %s\n" " author: %s\n"
" version: %s\n" " version: %s\n"
" copyright: %s\n" " copyright: %s\n"
" date: %s\n", " date: %s\n",
i->info->purpose, i->info.purpose ? i->info.purpose : "NONE",
i->info->author, i->info.author ? i->info.author : "NONE",
i->info->version, i->info.version ? i->info.version : "NONE",
i->info->copyright, i->info.copyright ? i->info.copyright : "NONE",
i->info->date); i->info.date ? i->info.date : "NONE");
}
} }
#endif #endif

View File

@ -93,7 +93,7 @@ static void gamma_configure_cancel_callback (GtkWidget *widget,
CdisplayGamma *gamma); CdisplayGamma *gamma);
static GimpModuleInfo cdisplay_gamma_info = static const GimpModuleInfo cdisplay_gamma_info =
{ {
N_("Gamma color display filter"), N_("Gamma color display filter"),
"Manish Singh <yosh@gimp.org>", "Manish Singh <yosh@gimp.org>",
@ -106,15 +106,17 @@ static GType cdisplay_gamma_type = 0;
static GimpColorDisplayClass *parent_class = NULL; static GimpColorDisplayClass *parent_class = NULL;
G_MODULE_EXPORT const GimpModuleInfo *
gimp_module_query (GTypeModule *module)
{
return &cdisplay_gamma_info;
}
G_MODULE_EXPORT gboolean G_MODULE_EXPORT gboolean
gimp_module_register (GTypeModule *module, gimp_module_register (GTypeModule *module)
GimpModuleInfo **inforet)
{ {
cdisplay_gamma_get_type (module); cdisplay_gamma_get_type (module);
if (inforet)
*inforet = &cdisplay_gamma_info;
return TRUE; return TRUE;
} }

View File

@ -93,7 +93,7 @@ static void contrast_configure_cancel_callback (GtkWidget *widget,
CdisplayContrast *contrast); CdisplayContrast *contrast);
static GimpModuleInfo cdisplay_contrast_info = static const GimpModuleInfo cdisplay_contrast_info =
{ {
N_("High Contrast color display filter"), N_("High Contrast color display filter"),
"Jay Cox <jaycox@earthlink.net>", "Jay Cox <jaycox@earthlink.net>",
@ -106,15 +106,17 @@ static GType cdisplay_contrast_type = 0;
static GimpColorDisplayClass *parent_class = NULL; static GimpColorDisplayClass *parent_class = NULL;
G_MODULE_EXPORT const GimpModuleInfo *
gimp_module_query (GTypeModule *module)
{
return &cdisplay_contrast_info;
}
G_MODULE_EXPORT gboolean G_MODULE_EXPORT gboolean
gimp_module_register (GTypeModule *module, gimp_module_register (GTypeModule *module)
GimpModuleInfo **inforet)
{ {
cdisplay_contrast_get_type (module); cdisplay_contrast_get_type (module);
if (inforet)
*inforet = &cdisplay_contrast_info;
return TRUE; return TRUE;
} }

View File

@ -106,7 +106,7 @@ static gboolean colorsel_triangle_event (GtkWidget *widget,
ColorselTriangle *triangle); ColorselTriangle *triangle);
static GimpModuleInfo colorsel_triangle_info = static const GimpModuleInfo colorsel_triangle_info =
{ {
N_("Painter-style color selector as a pluggable color selector"), N_("Painter-style color selector as a pluggable color selector"),
"Simon Budig <Simon.Budig@unix-ag.org>", "Simon Budig <Simon.Budig@unix-ag.org>",
@ -125,15 +125,17 @@ static GType colorsel_triangle_type = 0;
static GimpColorSelectorClass *parent_class = NULL; static GimpColorSelectorClass *parent_class = NULL;
G_MODULE_EXPORT const GimpModuleInfo *
gimp_module_query (GTypeModule *module)
{
return &colorsel_triangle_info;
}
G_MODULE_EXPORT gboolean G_MODULE_EXPORT gboolean
gimp_module_register (GTypeModule *module, gimp_module_register (GTypeModule *module)
GimpModuleInfo **info_return)
{ {
colorsel_triangle_get_type (module); colorsel_triangle_get_type (module);
if (info_return)
*info_return = &colorsel_triangle_info;
return TRUE; return TRUE;
} }

View File

@ -103,7 +103,7 @@ static void pressure_adjust_update (GtkAdjustment *adj,
ColorselWater *water); ColorselWater *water);
static GimpModuleInfo colorsel_water_info = static const GimpModuleInfo colorsel_water_info =
{ {
N_("Watercolor style color selector as a pluggable module"), N_("Watercolor style color selector as a pluggable module"),
"Raph Levien <raph@acm.org>, Sven Neumann <sven@gimp.org>", "Raph Levien <raph@acm.org>, Sven Neumann <sven@gimp.org>",
@ -122,15 +122,17 @@ static GType colorsel_water_type = 0;
static GimpColorSelectorClass *parent_class = NULL; static GimpColorSelectorClass *parent_class = NULL;
G_MODULE_EXPORT const GimpModuleInfo *
gimp_module_query (GTypeModule *module)
{
return &colorsel_water_info;
}
G_MODULE_EXPORT gboolean G_MODULE_EXPORT gboolean
gimp_module_register (GTypeModule *module, gimp_module_register (GTypeModule *module)
GimpModuleInfo **info_return)
{ {
colorsel_water_get_type (module); colorsel_water_get_type (module);
if (info_return)
*info_return = &colorsel_water_info;
return TRUE; return TRUE;
} }