From 9a350acf0497acd19e05b77e6aa985552c13a94a Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 2 Mar 2009 20:45:50 +0100 Subject: 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. --- src/input/curl_input_plugin.c | 15 ++++++++++++--- src/input/curl_input_plugin.h | 4 ---- src/input_plugin.h | 14 ++++++++++++++ src/input_stream.c | 15 +++++++++------ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/input/curl_input_plugin.c b/src/input/curl_input_plugin.c index b6d444a8a..a80c67d63 100644 --- a/src/input/curl_input_plugin.c +++ b/src/input/curl_input_plugin.c @@ -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, diff --git a/src/input/curl_input_plugin.h b/src/input/curl_input_plugin.h index 5ae06f065..89ceb5687 100644 --- a/src/input/curl_input_plugin.h +++ b/src/input/curl_input_plugin.h @@ -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 diff --git a/src/input_plugin.h b/src/input_plugin.h index 8f846373a..905596355 100644 --- a/src/input_plugin.h +++ b/src/input_plugin.h @@ -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); diff --git a/src/input_stream.c b/src/input_stream.c index 73c7acc2a..8896415bb 100644 --- a/src/input_stream.c +++ b/src/input_stream.c @@ -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 -- cgit v1.2.3