summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-03-02 20:45:50 +0100
committerMax Kellermann <max@duempel.org>2009-03-02 20:45:50 +0100
commit9a350acf0497acd19e05b77e6aa985552c13a94a (patch)
tree985bfbbc95a518a7b94351d2f1262be2daa08a62
parent36d24fb7eae3a7a761cb1659d10464f65ecdddf9 (diff)
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.
-rw-r--r--src/input/curl_input_plugin.c15
-rw-r--r--src/input/curl_input_plugin.h4
-rw-r--r--src/input_plugin.h14
-rw-r--r--src/input_stream.c15
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