input_plugin: added methods init(), finish()

Instead of hard-coding the plugin global initialization in
input_stream_global_init(), make it walk the plugin list and
initialize all plugins.
This commit is contained in:
Max Kellermann 2009-03-02 20:45:50 +01:00
parent 36d24fb7ea
commit 9a350acf04
4 changed files with 35 additions and 13 deletions

View File

@ -91,17 +91,23 @@ struct input_curl {
/** libcurl should accept "ICY 200 OK" */
static struct curl_slist *http_200_aliases;
void input_curl_global_init(void)
static bool
input_curl_init(void)
{
CURLcode code = curl_global_init(CURL_GLOBAL_ALL);
if (code != CURLE_OK)
if (code != CURLE_OK) {
g_warning("curl_global_init() failed: %s\n",
curl_easy_strerror(code));
return false;
}
http_200_aliases = curl_slist_append(http_200_aliases, "ICY 200 OK");
return true;
}
void input_curl_global_finish(void)
static void
input_curl_finish(void)
{
curl_slist_free_all(http_200_aliases);
@ -948,6 +954,9 @@ input_curl_open(struct input_stream *is, const char *url)
}
const struct input_plugin input_plugin_curl = {
.init = input_curl_init,
.finish = input_curl_finish,
.open = input_curl_open,
.close = input_curl_close,
.tag = input_curl_tag,

View File

@ -21,8 +21,4 @@
extern const struct input_plugin input_plugin_curl;
void input_curl_global_init(void);
void input_curl_global_finish(void);
#endif

View File

@ -28,6 +28,20 @@
struct input_stream;
struct input_plugin {
/**
* Global initialization. This method is called when MPD starts.
*
* @return true on success, false if the plugin should be
* disabled
*/
bool (*init)(void);
/**
* Global deinitialization. Called once before MPD shuts
* down (only if init() has returned true).
*/
void (*finish)(void);
bool (*open)(struct input_stream *is, const char *url);
void (*close)(struct input_stream *is);

View File

@ -49,21 +49,24 @@ static const struct input_plugin *const input_plugins[] = {
#endif
};
static bool input_plugins_enabled[G_N_ELEMENTS(input_plugins)];
static const unsigned num_input_plugins =
sizeof(input_plugins) / sizeof(input_plugins[0]);
void input_stream_global_init(void)
{
#ifdef HAVE_CURL
input_curl_global_init();
#endif
for (unsigned i = 0; i < num_input_plugins; ++i)
if (input_plugins[i]->init == NULL || input_plugins[i]->init())
input_plugins_enabled[i] = true;
}
void input_stream_global_finish(void)
{
#ifdef HAVE_CURL
input_curl_global_finish();
#endif
for (unsigned i = 0; i < num_input_plugins; ++i)
if (input_plugins_enabled[i] &&
input_plugins[i]->finish != NULL)
input_plugins[i]->finish();
}
bool