17 #include "xmms_configuration.h"
32 # include <memcheck.h>
37 #define get_module_ext(dir) g_build_filename (dir, "*.bundle", NULL)
39 #define get_module_ext(dir) g_module_build_path (dir, "*")
46 static GList *xmms_plugin_list;
53 static gboolean xmms_plugin_scan_directory (
const gchar *dir);
82 g_return_val_if_fail (plugin, NULL);
83 g_return_val_if_fail (key, NULL);
85 g_snprintf (path,
sizeof (path),
"%s.%s",
106 const gchar *default_value,
113 g_return_val_if_fail (plugin, NULL);
114 g_return_val_if_fail (name, NULL);
115 g_return_val_if_fail (default_value, NULL);
117 g_snprintf (fullpath,
sizeof (fullpath),
"%s.%s",
134 g_return_val_if_fail (plugin, 0);
147 g_return_val_if_fail (plugin, NULL);
160 g_return_val_if_fail (plugin, NULL);
173 g_return_val_if_fail (plugin, NULL);
186 g_return_val_if_fail (plugin, NULL);
197 xmms_plugin_add_builtin_plugins (
void)
205 xmms_plugin_load (&xmms_builtin_ringbuf, NULL);
206 xmms_plugin_load (&xmms_builtin_magic, NULL);
207 xmms_plugin_load (&xmms_builtin_converter, NULL);
208 xmms_plugin_load (&xmms_builtin_segment, NULL);
209 xmms_plugin_load (&xmms_builtin_visualization, NULL);
224 xmms_plugin_scan_directory (path);
226 xmms_plugin_add_builtin_plugins ();
245 VALGRIND_DO_LEAK_CHECK
249 while (xmms_plugin_list) {
262 xmms_plugin_list = g_list_delete_link (xmms_plugin_list,
276 XMMS_DBG (
"Loading plugin '%s'", desc->name);
278 switch (desc->type) {
294 if (desc->api_version != expected_ver) {
305 if (!xmms_plugin_setup (plugin, desc)) {
311 if (!desc->setup_func (plugin)) {
318 if (!verifier (plugin)) {
326 xmms_plugin_list = g_list_prepend (xmms_plugin_list, plugin);
336 xmms_plugin_scan_directory (
const gchar *dir)
348 XMMS_DBG (
"Scanning directory for plugins (%s)", temp);
350 pattern = g_path_get_basename (temp);
354 d = g_dir_open (dir, 0, NULL);
360 while ((name = g_dir_read_name (d))) {
362 if (!g_pattern_match_simple (pattern, name))
365 path = g_build_filename (dir, name, NULL);
366 if (!g_file_test (path, G_FILE_TEST_IS_REGULAR)) {
371 XMMS_DBG (
"Trying to load file: %s", path);
372 module = g_module_open (path, G_MODULE_BIND_LOCAL);
375 path, g_module_error ());
380 if (!g_module_symbol (module,
"XMMS_PLUGIN_DESC", &sym)) {
382 g_module_close (module);
389 g_module_close (module);
410 for (node = xmms_plugin_list; node; node = g_list_next (node)) {
414 if (!func (plugin, user_data))
423 } xmms_plugin_find_foreach_data_t;
426 xmms_plugin_find_foreach (
xmms_plugin_t *plugin, gpointer udata)
428 xmms_plugin_find_foreach_data_t *data = udata;
430 if (!g_ascii_strcasecmp (plugin->
shortname, data->name)) {
432 data->plugin = plugin;
447 xmms_plugin_find_foreach_data_t data = {name, NULL};
456 plugin->
type = desc->type;
458 plugin->
name = desc->name;
459 plugin->
version = desc->version;
469 g_module_close (plugin->
module);