2 * vim:ts=4:sw=4:et:cindent:cino=(0
12 #include "tweakr-types.h"
13 #include "libtweakr-section/tweakr-module.h"
14 #include "tweakr-module-manager.h"
25 tweakr_module_manager_constructor (GType type,
27 GObjectConstructParam *params);
29 tweakr_module_manager_finalize (GObject *object);
32 tweakr_module_manager_get_property (GObject *object,
38 tweakr_module_manager_set_property (GObject *object,
44 tweakr_module_manager_query_modules
45 (TweakrModuleManager *manager);
48 G_DEFINE_TYPE (TweakrModuleManager, tweakr_module_manager,
53 tweakr_module_manager_class_init (TweakrModuleManagerClass *klass)
55 GObjectClass *object_class = G_OBJECT_CLASS (klass);
57 object_class->constructor = tweakr_module_manager_constructor;
58 object_class->finalize = tweakr_module_manager_finalize;
59 object_class->get_property = tweakr_module_manager_get_property;
60 object_class->set_property = tweakr_module_manager_set_property;
62 g_object_class_install_property
63 (object_class, PROP_MODULE_PATH,
64 g_param_spec_string ("module-path",
66 "The path where to look for modules",
69 G_PARAM_CONSTRUCT_ONLY));
73 tweakr_module_manager_init (TweakrModuleManager *manager)
75 manager->module_path = NULL;
76 manager->modules = NULL;
80 tweakr_module_manager_constructor (GType type,
82 GObjectConstructParam *params)
85 TweakrModuleManager *manager;
87 object = G_OBJECT_CLASS
88 (tweakr_module_manager_parent_class)->constructor (type,
92 manager = TWEAKR_MODULE_MANAGER (object);
94 if (manager->module_path)
95 tweakr_module_manager_query_modules (manager);
101 tweakr_module_manager_finalize (GObject *object)
103 TweakrModuleManager *manager = TWEAKR_MODULE_MANAGER (object);
105 g_free (manager->module_path);
107 /* GTypeModules most not be finalized, don't unref them */
108 g_list_free (manager->modules);
110 G_OBJECT_CLASS (tweakr_module_manager_parent_class)->
115 tweakr_module_manager_get_property (GObject *object,
120 TweakrModuleManager *manager = TWEAKR_MODULE_MANAGER (object);
124 case PROP_MODULE_PATH:
125 g_value_set_string (value, manager->module_path);
128 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
134 tweakr_module_manager_set_property (GObject *object,
139 TweakrModuleManager *manager = TWEAKR_MODULE_MANAGER (object);
143 case PROP_MODULE_PATH:
144 manager->module_path = g_value_dup_string (value);
147 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
153 tweakr_module_manager_is_valid_module_name (const gchar *name)
155 return g_str_has_suffix (name, ".so");
159 tweakr_module_manager_query_modules (TweakrModuleManager *manager)
163 GError *error = NULL;
165 dir = g_dir_open (manager->module_path, 0, &error);
169 g_printerr ("Error while opening module dir: %s\n", error->message);
170 g_clear_error (&error);
174 while ((name = g_dir_read_name (dir)))
176 if (tweakr_module_manager_is_valid_module_name (name))
178 TweakrModule *module;
181 path = g_build_filename (manager->module_path, name, NULL);
182 module = tweakr_module_new (path);
184 if (! g_type_module_use (G_TYPE_MODULE (module)))
186 g_printerr ("Failed to load module: %s\n", path);
187 g_object_unref (module);
194 g_type_module_unuse (G_TYPE_MODULE (module));
196 manager->modules = g_list_prepend (manager->modules, module);