From 6ed77f2a27c332218a7144606af90404ba433397 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 5 Sep 2016 12:05:54 +0200 Subject: [PATCH] input/Plugin: migrate init() from class Error to C++ exceptions --- src/Main.cxx | 7 +----- src/input/Init.cxx | 25 +++---------------- src/input/Init.hxx | 4 +-- src/input/InputPlugin.hxx | 18 +++---------- src/input/plugins/CdioParanoiaInputPlugin.cxx | 16 +++++------- src/input/plugins/CurlInputPlugin.cxx | 5 ++-- src/input/plugins/FfmpegInputPlugin.cxx | 7 ++---- src/input/plugins/NfsInputPlugin.cxx | 5 ++-- src/input/plugins/SmbclientInputPlugin.cxx | 6 ++--- test/dump_playlist.cxx | 6 +---- test/dump_text_file.cxx | 12 +++++---- test/read_tags.cxx | 13 +++++----- test/run_decoder.cxx | 5 +--- test/run_input.cxx | 12 +++++---- test/visit_archive.cxx | 13 ++++++---- 15 files changed, 55 insertions(+), 99 deletions(-) diff --git a/src/Main.cxx b/src/Main.cxx index 5838eeeae..10e8b4d2f 100644 --- a/src/Main.cxx +++ b/src/Main.cxx @@ -536,12 +536,7 @@ try { instance->partition->pc); client_manager_init(); replay_gain_global_init(); - - if (!input_stream_global_init(error)) { - LogError(error); - return EXIT_FAILURE; - } - + input_stream_global_init(); playlist_list_global_init(); #ifdef ENABLE_DAEMON diff --git a/src/input/Init.cxx b/src/input/Init.cxx index dd5b12501..76eef53a0 100644 --- a/src/input/Init.cxx +++ b/src/input/Init.cxx @@ -21,7 +21,6 @@ #include "Init.hxx" #include "Registry.hxx" #include "InputPlugin.hxx" -#include "util/Error.hxx" #include "config/ConfigGlobal.hxx" #include "config/ConfigOption.hxx" #include "config/Block.hxx" @@ -33,8 +32,8 @@ #include -bool -input_stream_global_init(Error &error) +void +input_stream_global_init() { const ConfigBlock empty; @@ -54,12 +53,9 @@ input_stream_global_init(Error &error) /* the plugin is disabled in mpd.conf */ continue; - InputPlugin::InitResult result; - try { - result = plugin->init != nullptr - ? plugin->init(*block, error) - : InputPlugin::InitResult::SUCCESS; + if (plugin->init != nullptr) + plugin->init(*block); } catch (const PluginUnavailable &e) { FormatError(e, "Input plugin '%s' is unavailable", @@ -69,20 +65,7 @@ input_stream_global_init(Error &error) std::throw_with_nested(FormatRuntimeError("Failed to initialize input plugin '%s'", plugin->name)); } - - switch (result) { - case InputPlugin::InitResult::SUCCESS: - input_plugins_enabled[i] = true; - break; - - case InputPlugin::InitResult::ERROR: - error.FormatPrefix("Failed to initialize input plugin '%s': ", - plugin->name); - return false; - } } - - return true; } void input_stream_global_finish(void) diff --git a/src/input/Init.hxx b/src/input/Init.hxx index fff687901..37d68d4b7 100644 --- a/src/input/Init.hxx +++ b/src/input/Init.hxx @@ -25,8 +25,8 @@ class Error; /** * Initializes this library and all #InputStream implementations. */ -bool -input_stream_global_init(Error &error); +void +input_stream_global_init(); /** * Deinitializes this library and all #InputStream implementations. diff --git a/src/input/InputPlugin.hxx b/src/input/InputPlugin.hxx index b8fa37833..08a9d42fd 100644 --- a/src/input/InputPlugin.hxx +++ b/src/input/InputPlugin.hxx @@ -40,20 +40,6 @@ class Error; struct Tag; struct InputPlugin { - enum class InitResult { - /** - * A fatal error has occurred (e.g. misconfiguration). - * The #Error has been set. - */ - ERROR, - - /** - * The plugin was initialized successfully and is - * ready to be used. - */ - SUCCESS, - }; - const char *name; /** @@ -61,8 +47,10 @@ struct InputPlugin { * * Throws #PluginUnavailable if the plugin is not available * and shall be disabled. + * + * Throws std::runtime_error on (fatal) error. */ - InitResult (*init)(const ConfigBlock &block, Error &error); + void (*init)(const ConfigBlock &block); /** * Global deinitialization. Called once before MPD shuts diff --git a/src/input/plugins/CdioParanoiaInputPlugin.cxx b/src/input/plugins/CdioParanoiaInputPlugin.cxx index 6f71bfe4d..c9a3067f0 100644 --- a/src/input/plugins/CdioParanoiaInputPlugin.cxx +++ b/src/input/plugins/CdioParanoiaInputPlugin.cxx @@ -27,6 +27,7 @@ #include "../InputPlugin.hxx" #include "util/StringUtil.hxx" #include "util/StringCompare.hxx" +#include "util/RuntimeError.hxx" #include "util/Error.hxx" #include "util/Domain.hxx" #include "system/ByteOrder.hxx" @@ -105,8 +106,8 @@ static constexpr Domain cdio_domain("cdio"); static bool default_reverse_endian; -static InputPlugin::InitResult -input_cdio_init(const ConfigBlock &block, Error &error) +static void +input_cdio_init(const ConfigBlock &block) { const char *value = block.GetBlockValue("default_byte_order"); if (value != nullptr) { @@ -114,15 +115,10 @@ input_cdio_init(const ConfigBlock &block, Error &error) default_reverse_endian = IsBigEndian(); else if (strcmp(value, "big_endian") == 0) default_reverse_endian = IsLittleEndian(); - else { - error.Format(config_domain, 0, - "Unrecognized 'default_byte_order' setting: %s", - value); - return InputPlugin::InitResult::ERROR; - } + else + throw FormatRuntimeError("Unrecognized 'default_byte_order' setting: %s", + value); } - - return InputPlugin::InitResult::SUCCESS; } struct cdio_uri { diff --git a/src/input/plugins/CurlInputPlugin.cxx b/src/input/plugins/CurlInputPlugin.cxx index 4987a1b8d..38375d2f6 100644 --- a/src/input/plugins/CurlInputPlugin.cxx +++ b/src/input/plugins/CurlInputPlugin.cxx @@ -533,8 +533,8 @@ CurlMulti::OnTimeout() * */ -static InputPlugin::InitResult -input_curl_init(const ConfigBlock &block, gcc_unused Error &error) +static void +input_curl_init(const ConfigBlock &block) { CURLcode code = curl_global_init(CURL_GLOBAL_ALL); if (code != CURLE_OK) @@ -577,7 +577,6 @@ input_curl_init(const ConfigBlock &block, gcc_unused Error &error) } curl_multi = new CurlMulti(io_thread_get(), multi); - return InputPlugin::InitResult::SUCCESS; } static void diff --git a/src/input/plugins/FfmpegInputPlugin.cxx b/src/input/plugins/FfmpegInputPlugin.cxx index 46980c26e..1eb91f421 100644 --- a/src/input/plugins/FfmpegInputPlugin.cxx +++ b/src/input/plugins/FfmpegInputPlugin.cxx @@ -72,17 +72,14 @@ input_ffmpeg_supported(void) return avio_enum_protocols(&opaque, 0) != nullptr; } -static InputPlugin::InitResult -input_ffmpeg_init(gcc_unused const ConfigBlock &block, - gcc_unused Error &error) +static void +input_ffmpeg_init(gcc_unused const ConfigBlock &block) { FfmpegInit(); /* disable this plugin if there's no registered protocol */ if (!input_ffmpeg_supported()) throw PluginUnavailable("No protocol"); - - return InputPlugin::InitResult::SUCCESS; } static InputStream * diff --git a/src/input/plugins/NfsInputPlugin.cxx b/src/input/plugins/NfsInputPlugin.cxx index b6d4a204d..b2a9c8c30 100644 --- a/src/input/plugins/NfsInputPlugin.cxx +++ b/src/input/plugins/NfsInputPlugin.cxx @@ -215,11 +215,10 @@ NfsInputStream::OnNfsFileError(Error &&error) * */ -static InputPlugin::InitResult -input_nfs_init(const ConfigBlock &, Error &) +static void +input_nfs_init(const ConfigBlock &) { nfs_init(); - return InputPlugin::InitResult::SUCCESS; } static void diff --git a/src/input/plugins/SmbclientInputPlugin.cxx b/src/input/plugins/SmbclientInputPlugin.cxx index 948ed8160..d74afa828 100644 --- a/src/input/plugins/SmbclientInputPlugin.cxx +++ b/src/input/plugins/SmbclientInputPlugin.cxx @@ -68,8 +68,8 @@ public: * */ -static InputPlugin::InitResult -input_smbclient_init(gcc_unused const ConfigBlock &block, gcc_unused Error &error) +static void +input_smbclient_init(gcc_unused const ConfigBlock &block) { try { SmbclientInit(); @@ -81,8 +81,6 @@ input_smbclient_init(gcc_unused const ConfigBlock &block, gcc_unused Error &erro // TODO: create one global SMBCCTX here? // TODO: evaluate ConfigBlock, call smbc_setOption*() - - return InputPlugin::InitResult::SUCCESS; } static InputStream * diff --git a/test/dump_playlist.cxx b/test/dump_playlist.cxx index c3c869d86..1bb03b598 100644 --- a/test/dump_playlist.cxx +++ b/test/dump_playlist.cxx @@ -68,11 +68,7 @@ try { const ScopeIOThread io_thread; - if (!input_stream_global_init(error)) { - LogError(error); - return EXIT_FAILURE; - } - + input_stream_global_init(); playlist_list_global_init(); decoder_plugin_init_all(); diff --git a/test/dump_text_file.cxx b/test/dump_text_file.cxx index 92ac64a12..7934349d6 100644 --- a/test/dump_text_file.cxx +++ b/test/dump_text_file.cxx @@ -31,6 +31,8 @@ #include "archive/ArchiveList.hxx" #endif +#include + #include #include #include @@ -63,7 +65,7 @@ dump_input_stream(InputStreamPtr &&is) } int main(int argc, char **argv) -{ +try { int ret; if (argc != 2) { @@ -82,10 +84,7 @@ int main(int argc, char **argv) #endif Error error; - if (!input_stream_global_init(error)) { - LogError(error); - return 2; - } + input_stream_global_init(); /* open the stream and dump it */ @@ -116,4 +115,7 @@ int main(int argc, char **argv) config_global_finish(); return ret; +} catch (const std::exception &e) { + LogError(e); + return EXIT_FAILURE; } diff --git a/test/read_tags.cxx b/test/read_tags.cxx index f95403fb0..17833516e 100644 --- a/test/read_tags.cxx +++ b/test/read_tags.cxx @@ -31,6 +31,8 @@ #include "thread/Cond.hxx" #include "Log.hxx" +#include + #include #include #include @@ -68,7 +70,7 @@ static constexpr TagHandler print_handler = { }; int main(int argc, char **argv) -{ +try { const char *decoder_name; const struct DecoderPlugin *plugin; @@ -88,11 +90,7 @@ int main(int argc, char **argv) const ScopeIOThread io_thread; Error error; - if (!input_stream_global_init(error)) { - LogError(error); - return 2; - } - + input_stream_global_init(); decoder_plugin_init_all(); plugin = decoder_plugin_from_name(decoder_name); @@ -129,4 +127,7 @@ int main(int argc, char **argv) ScanGenericTags(path, print_handler, nullptr); return 0; +} catch (const std::exception &e) { + LogError(e); + return EXIT_FAILURE; } diff --git a/test/run_decoder.cxx b/test/run_decoder.cxx index 1d689a3d2..19abf0e7e 100644 --- a/test/run_decoder.cxx +++ b/test/run_decoder.cxx @@ -50,10 +50,7 @@ try { const ScopeIOThread io_thread; Error error; - if (!input_stream_global_init(error)) { - LogError(error); - return EXIT_FAILURE; - } + input_stream_global_init(); decoder_plugin_init_all(); diff --git a/test/run_input.cxx b/test/run_input.cxx index 757895124..726758506 100644 --- a/test/run_input.cxx +++ b/test/run_input.cxx @@ -34,6 +34,8 @@ #include "archive/ArchiveList.hxx" #endif +#include + #include #include @@ -91,7 +93,7 @@ dump_input_stream(InputStream *is) } int main(int argc, char **argv) -{ +try { if (argc != 2) { fprintf(stderr, "Usage: run_input URI\n"); return EXIT_FAILURE; @@ -108,10 +110,7 @@ int main(int argc, char **argv) #endif Error error; - if (!input_stream_global_init(error)) { - LogError(error); - return 2; - } + input_stream_global_init(); /* open the stream and dump it */ @@ -142,4 +141,7 @@ int main(int argc, char **argv) config_global_finish(); return ret; +} catch (const std::exception &e) { + LogError(e); + return EXIT_FAILURE; } diff --git a/test/visit_archive.cxx b/test/visit_archive.cxx index 6b50867b5..96c2eb9d2 100644 --- a/test/visit_archive.cxx +++ b/test/visit_archive.cxx @@ -28,6 +28,9 @@ #include "archive/ArchiveVisitor.hxx" #include "fs/Path.hxx" #include "util/Error.hxx" +#include "Log.hxx" + +#include #include #include @@ -42,7 +45,7 @@ class MyArchiveVisitor final : public ArchiveVisitor { int main(int argc, char **argv) -{ +try { Error error; if (argc != 3) { @@ -61,10 +64,7 @@ main(int argc, char **argv) archive_plugin_init_all(); - if (!input_stream_global_init(error)) { - fprintf(stderr, "%s", error.GetMessage()); - return 2; - } + input_stream_global_init(); /* open the archive and dump it */ @@ -95,4 +95,7 @@ main(int argc, char **argv) config_global_finish(); return result; +} catch (const std::exception &e) { + LogError(e); + return EXIT_FAILURE; }