41 #define FILENAME "plugin-registry"
53 GList * keys[INPUT_KEYS];
91 [INPUT_KEY_SCHEME] =
"scheme",
92 [INPUT_KEY_EXTENSION] =
"ext",
93 [INPUT_KEY_MIME] =
"mime"};
97 static pthread_mutex_t
mutex = PTHREAD_MUTEX_INITIALIZER;
147 g_list_free_full (plugin->
watches, g_free);
150 g_list_free_full (plugin->
u.
t.
schemes, g_free);
152 g_list_free_full (plugin->
u.
p.
exts, g_free);
155 for (
int key = 0; key < INPUT_KEYS; key ++)
156 g_list_free_full (plugin->
u.
i.
keys[key], g_free);
159 g_free (plugin->
path);
160 g_free (plugin->
name);
162 g_free (plugin->
misc);
169 FILE * file = fopen (path, mode);
176 for (GList * node = plugin->
u.
t.
schemes; node; node = node->next)
177 fprintf (handle,
"scheme %s\n", (
const char *) node->data);
182 for (GList * node = plugin->
u.
p.
exts; node; node = node->next)
183 fprintf (handle,
"ext %s\n", (
const char *) node->data);
188 for (
int key = 0; key < INPUT_KEYS; key ++)
190 for (GList * node = plugin->
u.
i.
keys[key]; node; node = node->next)
195 fprintf (handle,
"images %d\n", plugin->
u.
i.
has_images);
204 fprintf (handle,
"stamp %d\n", plugin->
timestamp);
205 fprintf (handle,
"name %s\n", plugin->
name);
208 fprintf (handle,
"domain %s\n", plugin->
domain);
210 fprintf (handle,
"priority %d\n", plugin->
priority);
211 fprintf (handle,
"about %d\n", plugin->
has_about);
213 fprintf (handle,
"enabled %d\n", plugin->
enabled);
226 g_return_if_fail (handle);
228 fprintf (handle,
"format %d\n",
FORMAT);
286 plugin->
u.
p.
exts = g_list_prepend (plugin->
u.
p.
exts, value);
293 for (
int key = 0; key < INPUT_KEYS; key ++)
298 plugin->
u.
i.
keys[key] = g_list_prepend (plugin->
u.
i.
keys[key],
392 AUDDBG (
"Plugin not found: %s\n", plugin->
path);
423 return strcmp (plugin->
path, path);
428 GList * node = g_list_find_custom (
plugin_list, path, (GCompareFunc)
430 return node ? node->data :
NULL;
435 char * test = g_path_get_basename (plugin->
path);
437 char * dot = strrchr (test,
'.');
441 int ret = strcmp (test, basename);
451 GList * node = g_list_find_custom (
plugin_list, basename, (GCompareFunc)
453 return node ? node->data :
NULL;
460 g_free (plugin->
name);
462 plugin->
name = g_strdup (header->name);
471 g_list_free_full (plugin->
u.
t.
schemes, g_free);
474 for (
int i = 0; tp->
schemes[i]; i ++)
482 g_list_free_full (plugin->
u.
p.
exts, g_free);
486 plugin->
u.
p.
exts = g_list_prepend (plugin->
u.
p.
exts, g_strdup
494 for (
int key = 0; key < INPUT_KEYS; key ++)
496 g_list_free_full (plugin->
u.
i.
keys[key], g_free);
503 plugin->
u.
i.
keys[INPUT_KEY_EXTENSION] = g_list_prepend
504 (plugin->
u.
i.
keys[INPUT_KEY_EXTENSION], g_strdup
510 for (
int i = 0; ip->
mimes[i]; i ++)
511 plugin->
u.
i.
keys[INPUT_KEY_MIME] = g_list_prepend
512 (plugin->
u.
i.
keys[INPUT_KEY_MIME], g_strdup (ip->
mimes[i]));
517 for (
int i = 0; ip->
schemes[i]; i ++)
518 plugin->
u.
i.
keys[INPUT_KEY_SCHEME] = g_list_prepend
519 (plugin->
u.
i.
keys[INPUT_KEY_SCHEME], g_strdup (ip->
schemes[i]));
551 AUDDBG (
"Register plugin: %s\n", path);
556 AUDDBG (
"Rescan plugin: %s\n", path);
558 if (! header || header->type != plugin->
type)
570 AUDDBG (
"New plugin: %s\n", path);
576 header->type, header);
594 pthread_mutex_lock (&
mutex);
599 if (! header || header->type != plugin->
type)
607 pthread_mutex_unlock (&
mutex);
613 return (plugin->
header == header) ? 0 : -1;
618 GList * node = g_list_find_custom (
plugin_list, header, (GCompareFunc)
620 return node ? node->data :
NULL;
625 for (GList * node =
plugin_list; node; node = node->next)
629 if (! func (node->data, data))
636 return dgettext (plugin->
domain, plugin->
name);
656 for (GList * node = plugin->
watches; node; )
658 GList * next = node->next;
661 if (! watch->
func (plugin, watch->
data))
687 return state->
func (plugin, state->
data);
708 for (GList * node = plugin->
watches; node; )
710 GList * next = node->next;
713 if (watch->
func == func && watch->
data == data)
726 plugin->
misc = g_malloc0 (size);
740 (GCompareFunc) g_ascii_strcasecmp))
763 if (! g_list_find_custom (plugin->
u.
p.
exts, state->
ext,
764 (GCompareFunc) g_ascii_strcasecmp))
789 if (! g_list_find_custom (plugin->
u.
i.
keys[state->
key], state->
value,
790 (GCompareFunc) g_ascii_strcasecmp))
793 return state->
func (plugin, state->
data);
bool_t plugin_get_enabled(PluginHandle *plugin)
static void transport_plugin_parse(PluginHandle *plugin, FILE *handle)
bool_t input_plugin_has_images(PluginHandle *plugin)
PLUGIN_COMMON_FIELDS bool_t enabled_by_default
void plugin_set_enabled(PluginHandle *plugin, bool_t enabled)
int plugin_compare(PluginHandle *a, PluginHandle *b)
static const char * plugin_type_names[]
static const char * input_key_names[]
union PluginHandle::@21 u
static float a[EQ_BANDS][2]
static int plugin_by_header_cb(PluginHandle *plugin, const void *header)
PLUGIN_COMMON_FIELDS int probe_priority
static void parse_next(FILE *handle)
void plugin_register(const char *path, int timestamp)
static bool_t plugin_for_enabled_cb(PluginHandle *plugin, PluginForEnabledState *state)
static void plugin_call_watches(PluginHandle *plugin)
void plugin_registry_prune(void)
Plugin * plugin_load(const char *filename)
void input_plugin_for_key(int key, const char *value, PluginForEachFunc func, void *data)
void plugin_remove_watch(PluginHandle *plugin, PluginForEachFunc func, void *data)
PluginHandle * plugin_lookup_basename(const char *basename)
static FILE * open_registry_file(const char *mode)
static float b[EQ_BANDS][2]
#define PLUGIN_HAS_FUNC(p, func)
bool_t input_plugin_can_write_tuple(PluginHandle *plugin)
static bool_t registry_locked
PLUGIN_COMMON_FIELDS const char *const * schemes
static bool_t transport_plugin_for_scheme_cb(PluginHandle *plugin, TransportPluginForSchemeState *state)
PluginHandle * playlist_plugin_for_extension(const char *extension)
EXPORT int string_compare(const char *ap, const char *bp)
static void plugin_prune(PluginHandle *plugin)
static PluginHandle * plugin_new(char *path, bool_t confirmed, bool_t loaded, int timestamp, int type, Plugin *header)
static void input_plugin_save(PluginHandle *plugin, FILE *handle)
const void * plugin_get_header(PluginHandle *plugin)
static char * parse_value
void plugin_registry_load(void)
void plugin_registry_save(void)
static bool_t parse_integer(const char *key, int *value)
bool_t input_plugin_has_infowin(PluginHandle *plugin)
static void playlist_plugin_save(PluginHandle *plugin, FILE *handle)
void * plugin_get_misc_data(PluginHandle *plugin, int size)
bool_t plugin_has_about(PluginHandle *plugin)
static void plugin_get_info(PluginHandle *plugin, bool_t new)
bool_t plugin_has_configure(PluginHandle *plugin)
bool_t(* PluginForEachFunc)(PluginHandle *plugin, void *data)
static void transport_plugin_save(PluginHandle *plugin, FILE *handle)
static bool_t playlist_plugin_for_ext_cb(PluginHandle *plugin, PlaylistPluginForExtState *state)
static int plugin_lookup_cb(PluginHandle *plugin, const char *path)
static void plugin_save(PluginHandle *plugin, FILE *handle)
static char parse_key[512]
static bool_t plugin_parse(FILE *handle)
const char * get_path(int id)
static GList * plugin_list
PluginHandle * transport_plugin_for_scheme(const char *scheme)
static void plugin_free(PluginHandle *plugin)
static int plugin_lookup_basename_cb(PluginHandle *plugin, const char *basename)
void plugin_for_enabled(int type, PluginForEachFunc func, void *data)
const char * plugin_get_filename(PluginHandle *plugin)
static pthread_mutex_t mutex
bool_t input_plugin_has_subtunes(PluginHandle *plugin)
void data PluginHandle plugin
static bool_t input_plugin_for_key_cb(PluginHandle *plugin, InputPluginForKeyState *state)
void plugin_for_each(int type, PluginForEachFunc func, void *data)
PluginHandle * plugin_by_header(const void *header)
const char * plugin_get_name(PluginHandle *plugin)
PluginHandle * plugin_lookup(const char *path)
static void playlist_plugin_parse(PluginHandle *plugin, FILE *handle)
int plugin_get_type(PluginHandle *plugin)
static void input_plugin_parse(PluginHandle *plugin, FILE *handle)
void plugin_add_watch(PluginHandle *plugin, PluginForEachFunc func, void *data)
PLUGIN_COMMON_FIELDS const char *const * extensions
static char * parse_string(const char *key)