From 6af2111204054bee08f66f92d70744392b006ae5 Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Sat, 31 May 2008 19:09:07 +0200 Subject: [PATCH] Implement handling of provider types --- src/mm-module-manager.c | 6 ++--- src/mm-module.c | 64 +++++++++++++++++++++++++++++++++++++------------ 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/mm-module-manager.c b/src/mm-module-manager.c index 7157d0b..189f7c9 100644 --- a/src/mm-module-manager.c +++ b/src/mm-module-manager.c @@ -48,16 +48,16 @@ load_modules (MMModuleManager *manager) details->path, error->message); } else { const char *name; - + while ((name = g_dir_read_name (dir))) { if (g_str_has_suffix (name, "." G_MODULE_SUFFIX)) { char *filename; MMModule *module; - + filename = g_build_filename (details->path, name, NULL); module = mm_module_load_file (filename); g_free (filename); - + if (module) { g_list_prepend (details->modules, module); } diff --git a/src/mm-module.c b/src/mm-module.c index 1f276a3..1498e52 100644 --- a/src/mm-module.c +++ b/src/mm-module.c @@ -21,6 +21,9 @@ #include #include +#define MM_MODULE_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_MODULE, MMModuleDetails)) + G_DEFINE_TYPE (MMModule, mm_module, G_TYPE_TYPE_MODULE); struct _MMModuleDetails { @@ -41,34 +44,43 @@ mm_module_class_init (MMModuleClass *klass) type_module_class->load = mm_module_load; type_module_class->unload = mm_module_unload; + + g_type_class_add_private (klass, sizeof (MMModuleDetails)); +} + +static void +mm_module_init (MMModule *module) +{ + module->details = MM_MODULE_GET_PRIVATE (module); } static gboolean mm_module_load (GTypeModule *gtm) { MMModule *module = MM_MODULE (gtm); + MMModuleDetails *details = module->details; - module->library = g_module_open (module->filename, - G_MODULE_BIND_LAZY | - G_MODULE_BIND_LOCAL); - if (!module->library) { + details->library = g_module_open (details->filename, + G_MODULE_BIND_LAZY | + G_MODULE_BIND_LOCAL); + if (!details->library) { g_warning ("error while loading module %s: %s", - module->filename, g_module_error ()); + details->filename, g_module_error ()); return FALSE; } - if (!g_module_symbol (module->library, + if (!g_module_symbol (details->library, "mm_module_initialize", (gpointer *) &module->initialize) || - !g_module_symbol (module->library, + !g_module_symbol (details->library, "mm_module_shutdown", (gpointer *) &module->shutdown) || - !g_module_symbol (module->library, + !g_module_symbol (details->library, "mm_module_get_gtypes", (gpointer *) &module->get_gtypes)) { g_warning ("Unable to resolve symbols inside the module %s: %s", - module->filename, g_module_error ()); - g_module_close (module->library); + details->filename, g_module_error ()); + g_module_close (details->library); return FALSE; } @@ -85,22 +97,44 @@ mm_module_unload (GTypeModule *gtm) module->shutdown (); - g_module_close (module->library); + g_module_close (module->details->library); module->initialize = NULL; module->shutdown = NULL; module->get_gtypes = NULL; } +static GObject * +mm_module_create_provider (MMModule *module, GType type) +{ + return g_object_new (type, NULL); +} + +static void +mm_module_add_types (MMModule *module, GType *types) +{ + /* types[0] implements MMApplicationProvider + * types[1] implements MMCategoryProvider + * types[2] implements MMHitCollectionProvider + */ + MMModuleDetails *details = module->details; + + details->application_provider = + MM_APPLICATION_PROVIDER (mm_module_create_provider (module, types[0])); + details->category_provider = + MM_CATEGORY_PROVIDER (mm_module_create_provider (module, types[1])); + details->collection_provider = + MM_HIT_COLLECTION_PROVIDER (mm_module_create_provider (module, types[2])); +} + static void add_module_objects (MMModule *module) { const GType *types; module->get_gtypes (&types); - mm_module_add_application_provider (types[0]); - mm_module_add_category_provider (types[1]); - mm_module_add_hit_collection_provider (types[2]); + + mm_module_add_types (module, types); } MMModule * @@ -109,7 +143,7 @@ mm_module_load_file (const char *path) MMModule *module; module = g_object_new (MM_TYPE_MODULE, NULL); - module->filename = g_strdup (path); + module->details->filename = g_strdup (path); if (g_type_module_use (G_TYPE_MODULE (module))) { add_module_objects (module); -- 2.11.4.GIT