diff --git a/Makefile.am b/Makefile.am index f6ea2b7ed..eee560d86 100644 --- a/Makefile.am +++ b/Makefile.am @@ -399,7 +399,6 @@ libutil_a_SOURCES = \ src/util/AllocatedArray.hxx \ src/util/VarSize.hxx \ src/util/ScopeExit.hxx \ - src/util/Error.cxx src/util/Error.hxx \ src/util/Domain.hxx \ src/util/ReusableArray.hxx \ src/util/ASCII.hxx \ diff --git a/src/Instance.hxx b/src/Instance.hxx index ed220b794..368e6afdd 100644 --- a/src/Instance.hxx +++ b/src/Instance.hxx @@ -37,7 +37,6 @@ class Storage; class UpdateService; #endif -class Error; class ClientList; struct Partition; class StateFile; diff --git a/src/Log.cxx b/src/Log.cxx index 330ac4bc0..232e7d49d 100644 --- a/src/Log.cxx +++ b/src/Log.cxx @@ -19,7 +19,7 @@ #include "config.h" #include "LogV.hxx" -#include "util/Error.hxx" +#include "util/Domain.hxx" #include @@ -27,6 +27,8 @@ #include #include +static constexpr Domain exception_domain("exception"); + void LogFormatV(const Domain &domain, LogLevel level, const char *fmt, va_list ap) { diff --git a/src/PlaylistDatabase.hxx b/src/PlaylistDatabase.hxx index fd2be89b5..9b5aefb7e 100644 --- a/src/PlaylistDatabase.hxx +++ b/src/PlaylistDatabase.hxx @@ -27,7 +27,6 @@ class PlaylistVector; class BufferedOutputStream; class TextFile; -class Error; void playlist_vector_save(BufferedOutputStream &os, const PlaylistVector &pv); diff --git a/src/PlaylistFile.hxx b/src/PlaylistFile.hxx index 6fa846849..a453f8118 100644 --- a/src/PlaylistFile.hxx +++ b/src/PlaylistFile.hxx @@ -26,7 +26,6 @@ class DetachedSong; class SongLoader; class PlaylistVector; -class Error; class AllocatedPath; typedef std::vector PlaylistFileContents; diff --git a/src/SongLoader.hxx b/src/SongLoader.hxx index 409af7b66..aa867af38 100644 --- a/src/SongLoader.hxx +++ b/src/SongLoader.hxx @@ -30,7 +30,6 @@ class Database; class Storage; class DetachedSong; class Path; -class Error; struct LocatedUri; /** diff --git a/src/SongSave.hxx b/src/SongSave.hxx index 5c29fbfd9..0b33cbea0 100644 --- a/src/SongSave.hxx +++ b/src/SongSave.hxx @@ -26,7 +26,6 @@ struct Song; class DetachedSong; class BufferedOutputStream; class TextFile; -class Error; void song_save(BufferedOutputStream &os, const Song &song); diff --git a/src/config/Param.hxx b/src/config/Param.hxx index 50530292e..4a4a5bc4e 100644 --- a/src/config/Param.hxx +++ b/src/config/Param.hxx @@ -25,7 +25,6 @@ #include -class Error; class AllocatedPath; struct ConfigParam { diff --git a/src/db/plugins/simple/DatabaseSave.hxx b/src/db/plugins/simple/DatabaseSave.hxx index dd5341d32..3102c38eb 100644 --- a/src/db/plugins/simple/DatabaseSave.hxx +++ b/src/db/plugins/simple/DatabaseSave.hxx @@ -23,7 +23,6 @@ struct Directory; class BufferedOutputStream; class TextFile; -class Error; void db_save_internal(BufferedOutputStream &os, const Directory &root); diff --git a/src/db/plugins/simple/DirectorySave.hxx b/src/db/plugins/simple/DirectorySave.hxx index 3737710f9..11865d6c6 100644 --- a/src/db/plugins/simple/DirectorySave.hxx +++ b/src/db/plugins/simple/DirectorySave.hxx @@ -23,7 +23,6 @@ struct Directory; class TextFile; class BufferedOutputStream; -class Error; void directory_save(BufferedOutputStream &os, const Directory &directory); diff --git a/src/db/plugins/upnp/Directory.hxx b/src/db/plugins/upnp/Directory.hxx index f4be54474..b2b2b7107 100644 --- a/src/db/plugins/upnp/Directory.hxx +++ b/src/db/plugins/upnp/Directory.hxx @@ -26,8 +26,6 @@ #include #include -class Error; - /** * Image of a MediaServer Directory Service container (directory), * possibly containing items and subordinate containers. diff --git a/src/encoder/plugins/TwolameEncoderPlugin.cxx b/src/encoder/plugins/TwolameEncoderPlugin.cxx index c49501524..b4123bf5b 100644 --- a/src/encoder/plugins/TwolameEncoderPlugin.cxx +++ b/src/encoder/plugins/TwolameEncoderPlugin.cxx @@ -56,8 +56,6 @@ public: audio_format(_audio_format), options(_options) {} ~TwolameEncoder() override; - bool Configure(const ConfigBlock &block, Error &error); - /* virtual methods from class Encoder */ void End() override { diff --git a/src/filter/FilterInternal.hxx b/src/filter/FilterInternal.hxx index 6cf8c37cb..b99974a07 100644 --- a/src/filter/FilterInternal.hxx +++ b/src/filter/FilterInternal.hxx @@ -30,7 +30,6 @@ #include struct AudioFormat; -class Error; template struct ConstBuffer; class Filter { diff --git a/src/filter/plugins/ConvertFilterPlugin.hxx b/src/filter/plugins/ConvertFilterPlugin.hxx index 9d7890574..ef5d5dc71 100644 --- a/src/filter/plugins/ConvertFilterPlugin.hxx +++ b/src/filter/plugins/ConvertFilterPlugin.hxx @@ -21,7 +21,6 @@ #define MPD_CONVERT_FILTER_PLUGIN_HXX class Filter; -class Error; struct AudioFormat; Filter * diff --git a/src/fs/Charset.hxx b/src/fs/Charset.hxx index f0d6e15e6..7aeda8aaf 100644 --- a/src/fs/Charset.hxx +++ b/src/fs/Charset.hxx @@ -28,8 +28,6 @@ #define HAVE_FS_CHARSET #endif -class Error; - /** * Gets file system character set name. */ diff --git a/src/fs/Config.hxx b/src/fs/Config.hxx index 78cda056e..9e6c0e5eb 100644 --- a/src/fs/Config.hxx +++ b/src/fs/Config.hxx @@ -22,8 +22,6 @@ #include "check.h" -class Error; - /** * Performs global one-time initialization of this class. * diff --git a/src/input/Init.hxx b/src/input/Init.hxx index 37d68d4b7..29744a318 100644 --- a/src/input/Init.hxx +++ b/src/input/Init.hxx @@ -20,8 +20,6 @@ #ifndef MPD_INPUT_INIT_HXX #define MPD_INPUT_INIT_HXX -class Error; - /** * Initializes this library and all #InputStream implementations. */ diff --git a/src/input/InputStream.hxx b/src/input/InputStream.hxx index f0330cb82..bbb3aeccf 100644 --- a/src/input/InputStream.hxx +++ b/src/input/InputStream.hxx @@ -31,7 +31,6 @@ #include class Cond; -class Error; struct Tag; class InputStream { diff --git a/src/lib/expat/ExpatParser.hxx b/src/lib/expat/ExpatParser.hxx index 7b5af23b5..1b12be767 100644 --- a/src/lib/expat/ExpatParser.hxx +++ b/src/lib/expat/ExpatParser.hxx @@ -28,7 +28,6 @@ #include class InputStream; -class Error; class ExpatError final : public std::runtime_error { public: diff --git a/src/lib/icu/Collate.hxx b/src/lib/icu/Collate.hxx index 5bfe5ab05..d119d6fd9 100644 --- a/src/lib/icu/Collate.hxx +++ b/src/lib/icu/Collate.hxx @@ -23,7 +23,6 @@ #include "check.h" #include "Compiler.h" -class Error; template class AllocatedString; /** diff --git a/src/lib/nfs/Lease.hxx b/src/lib/nfs/Lease.hxx index 37db7100c..21a8d615c 100644 --- a/src/lib/nfs/Lease.hxx +++ b/src/lib/nfs/Lease.hxx @@ -24,8 +24,6 @@ #include -class Error; - class NfsLease { public: /** diff --git a/src/net/AllocatedSocketAddress.hxx b/src/net/AllocatedSocketAddress.hxx index db02488df..c865d17dd 100644 --- a/src/net/AllocatedSocketAddress.hxx +++ b/src/net/AllocatedSocketAddress.hxx @@ -39,7 +39,6 @@ #include struct sockaddr; -class Error; class AllocatedSocketAddress { public: diff --git a/src/player/Control.hxx b/src/player/Control.hxx index 4b56e88b6..4af87e964 100644 --- a/src/player/Control.hxx +++ b/src/player/Control.hxx @@ -31,7 +31,6 @@ #include -class Error; class PlayerListener; class MultipleOutputs; class DetachedSong; diff --git a/src/playlist/PlaylistQueue.hxx b/src/playlist/PlaylistQueue.hxx index e120926bc..7e6cac519 100644 --- a/src/playlist/PlaylistQueue.hxx +++ b/src/playlist/PlaylistQueue.hxx @@ -24,7 +24,6 @@ #ifndef MPD_PLAYLIST_QUEUE_HXX #define MPD_PLAYLIST_QUEUE_HXX -class Error; class SongLoader; class SongEnumerator; struct playlist; diff --git a/src/queue/Playlist.hxx b/src/queue/Playlist.hxx index a69f8b52e..c77e347b7 100644 --- a/src/queue/Playlist.hxx +++ b/src/queue/Playlist.hxx @@ -26,7 +26,6 @@ enum TagType : uint8_t; struct PlayerControl; class DetachedSong; class Database; -class Error; class SongLoader; class SongTime; class SignedSongTime; diff --git a/src/sticker/StickerDatabase.hxx b/src/sticker/StickerDatabase.hxx index af7be8af7..4e07554fd 100644 --- a/src/sticker/StickerDatabase.hxx +++ b/src/sticker/StickerDatabase.hxx @@ -47,7 +47,6 @@ #include -class Error; class Path; struct Sticker; diff --git a/src/util/Error.cxx b/src/util/Error.cxx deleted file mode 100644 index 4fc067636..000000000 --- a/src/util/Error.cxx +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (C) 2013 Max Kellermann - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "Error.hxx" -#include "Domain.hxx" - -#include - -#ifdef WIN32 -#include -#endif - -#include -#include -#include -#include - -const Domain exception_domain("exception"); - -const Domain errno_domain("errno"); - -#ifdef WIN32 -const Domain win32_domain("win32"); -#endif - -Error::~Error() {} - -void -Error::Set(std::exception_ptr src) -{ - try { - /* classify the exception */ - std::rethrow_exception(src); - } catch (const std::system_error &se) { - if (se.code().category() == std::system_category()) { -#ifdef WIN32 - Set(win32_domain, se.code().value(), se.what()); -#else - Set(errno_domain, se.code().value(), se.what()); -#endif - } else - Set(exception_domain, se.what()); - } catch (const std::exception &e) { - Set(exception_domain, e.what()); - } catch (...) { - Set(exception_domain, "Unknown exception"); - } -} - -void -Error::Set(const Domain &_domain, int _code, const char *_message) -{ - domain = &_domain; - code = _code; - message.assign(_message); -} - -void -Error::Format2(const Domain &_domain, int _code, const char *fmt, ...) -{ - char buffer[1024]; - va_list ap; - va_start(ap, fmt); - vsnprintf(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - Set(_domain, _code, buffer); -} - -void -Error::FormatPrefix(const char *fmt, ...) -{ - char buffer[1024]; - va_list ap; - va_start(ap, fmt); - vsnprintf(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - AddPrefix(buffer); -} - -void -Error::SetErrno(int e) -{ - Set(errno_domain, e, strerror(e)); -} - -void -Error::SetErrno() -{ - SetErrno(errno); -} - -void -Error::SetErrno(int e, const char *prefix) -{ - Format(errno_domain, e, "%s: %s", prefix, strerror(e)); -} - -void -Error::SetErrno(const char *prefix) -{ - SetErrno(errno, prefix); -} - -void -Error::FormatErrno(int e, const char *fmt, ...) -{ - char buffer[1024]; - va_list ap; - va_start(ap, fmt); - vsnprintf(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - SetErrno(e, buffer); -} - -void -Error::FormatErrno(const char *fmt, ...) -{ - const int e = errno; - - char buffer[1024]; - va_list ap; - va_start(ap, fmt); - vsnprintf(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - SetErrno(e, buffer); -} - -#ifdef WIN32 - -void -Error::SetLastError(DWORD _code, const char *prefix) -{ - char msg[256]; - FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, _code, 0, msg, sizeof(msg), nullptr); - - Format(win32_domain, int(_code), "%s: %s", prefix, msg); -} - -void -Error::SetLastError(const char *prefix) -{ - SetLastError(GetLastError(), prefix); -} - -void -Error::FormatLastError(DWORD _code, const char *fmt, ...) -{ - char buffer[1024]; - va_list ap; - va_start(ap, fmt); - vsnprintf(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - SetLastError(_code, buffer); -} - -void -Error::FormatLastError(const char *fmt, ...) -{ - DWORD _code = GetLastError(); - - char buffer[1024]; - va_list ap; - va_start(ap, fmt); - vsnprintf(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - SetLastError(_code, buffer); -} - -#endif diff --git a/src/util/Error.hxx b/src/util/Error.hxx deleted file mode 100644 index dc6d793bc..000000000 --- a/src/util/Error.hxx +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (C) 2013 Max Kellermann - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef ERROR_HXX -#define ERROR_HXX - -#include "check.h" -#include "Compiler.h" - -#include -#include -#include - -#include - -class Domain; - -/** Domain for std::exception */ -extern const Domain exception_domain; - -extern const Domain errno_domain; - -#ifdef WIN32 -/* fuck WIN32! */ -#include -#define IgnoreError MPDIgnoreError -#undef GetMessage - -/** - * Domain for GetLastError(). - */ -extern const Domain win32_domain; -#endif - -/** - * This class contains information about a runtime error. - */ -class Error { - const Domain *domain; - int code; - std::string message; - -public: - Error():domain(nullptr), code(0) {} - - Error(const Domain &_domain, int _code, const char *_message) - :domain(&_domain), code(_code), message(_message) {} - - Error(const Domain &_domain, const char *_message) - :domain(&_domain), code(0), message(_message) {} - - ~Error(); - - bool IsDefined() const { - return domain != nullptr; - } - - void Clear() { - domain = nullptr; - } - - const Domain &GetDomain() const { - assert(IsDefined()); - - return *domain; - } - - bool IsDomain(const Domain &other) const { - return domain == &other; - } - - int GetCode() const { - assert(IsDefined()); - - return code; - } - - const char *GetMessage() const { - assert(IsDefined()); - - return message.c_str(); - } - - void Set(const Error &other) { - assert(!IsDefined()); - assert(other.IsDefined()); - - domain = other.domain; - code = other.code; - message = other.message; - } - - void Set(std::exception_ptr src); - - void Set(const Domain &_domain, int _code, const char *_message); - - void Set(const Domain &_domain, const char *_message) { - Set(_domain, 0, _message); - } - -private: - void Format2(const Domain &_domain, int _code, const char *fmt, ...); - -public: - template - void Format(const Domain &_domain, int _code, - const char *fmt, Args&&... args) { - Format2(_domain, _code, fmt, std::forward(args)...); - } - - template - void Format(const Domain &_domain, const char *fmt, Args&&... args) { - Format2(_domain, 0, fmt, std::forward(args)...); - } - - void AddPrefix(const char *prefix) { - message.insert(0, prefix); - } - - gcc_printf(2,3) - void FormatPrefix(const char *fmt, ...); - - void SetErrno(int e); - void SetErrno(); - void SetErrno(int e, const char *prefix); - void SetErrno(const char *prefix); - - gcc_printf(2,3) - void FormatErrno(const char *prefix, ...); - - gcc_printf(3,4) - void FormatErrno(int e, const char *prefix, ...); - -#ifdef WIN32 - void SetLastError(DWORD _code, const char *prefix); - void SetLastError(const char *prefix); - - gcc_printf(3,4) - void FormatLastError(DWORD code, const char *fmt, ...); - - gcc_printf(2,3) - void FormatLastError(const char *fmt, ...); -#endif -}; - -/** - * Pass a temporary instance of this class to ignore errors. - */ -class IgnoreError final { - Error error; - -public: - operator Error &() { - assert(!error.IsDefined()); - - return error; - } -}; - -#endif diff --git a/test/TestFs.cxx b/test/TestFs.cxx index aa840f848..3719244a7 100644 --- a/test/TestFs.cxx +++ b/test/TestFs.cxx @@ -4,7 +4,6 @@ #include "config.h" #include "fs/Glob.hxx" -#include "util/Error.hxx" #include #include diff --git a/test/TestIcu.cxx b/test/TestIcu.cxx index 843b4c64e..4c9798d40 100644 --- a/test/TestIcu.cxx +++ b/test/TestIcu.cxx @@ -6,7 +6,6 @@ #include "lib/icu/Converter.hxx" #include "util/AllocatedString.hxx" #include "util/StringAPI.hxx" -#include "util/Error.hxx" #include #include diff --git a/test/WriteFile.cxx b/test/WriteFile.cxx index 307d89c61..e5c9c0b2d 100644 --- a/test/WriteFile.cxx +++ b/test/WriteFile.cxx @@ -20,7 +20,6 @@ #include "config.h" #include "fs/io/FileOutputStream.hxx" #include "Log.hxx" -#include "util/Error.hxx" #include #include @@ -32,8 +31,6 @@ static bool Copy(OutputStream &dest, int src) { - Error error; - while (true) { uint8_t buffer[8192]; ssize_t nbytes = read(src, buffer, sizeof(buffer)); diff --git a/test/read_mixer.cxx b/test/read_mixer.cxx index ce45e863f..f50a7ad48 100644 --- a/test/read_mixer.cxx +++ b/test/read_mixer.cxx @@ -25,7 +25,6 @@ #include "Main.hxx" #include "event/Loop.hxx" #include "config/Block.hxx" -#include "util/Error.hxx" #include "Log.hxx" #include diff --git a/test/run_gunzip.cxx b/test/run_gunzip.cxx index eb619b36d..6fcc0b0b9 100644 --- a/test/run_gunzip.cxx +++ b/test/run_gunzip.cxx @@ -22,7 +22,6 @@ #include "fs/io/FileReader.hxx" #include "fs/io/StdioOutputStream.hxx" #include "Log.hxx" -#include "util/Error.hxx" #include #include diff --git a/test/run_storage.cxx b/test/run_storage.cxx index 81fb04cd3..aace0e0d1 100644 --- a/test/run_storage.cxx +++ b/test/run_storage.cxx @@ -23,7 +23,6 @@ #include "storage/Registry.hxx" #include "storage/StorageInterface.hxx" #include "storage/FileInfo.hxx" -#include "util/Error.hxx" #include #include diff --git a/test/test_rewind.cxx b/test/test_rewind.cxx index 882352a92..d7ae7c8c9 100644 --- a/test/test_rewind.cxx +++ b/test/test_rewind.cxx @@ -7,7 +7,6 @@ #include "input/InputStream.hxx" #include "thread/Mutex.hxx" #include "thread/Cond.hxx" -#include "util/Error.hxx" #include #include @@ -73,7 +72,6 @@ public: CPPUNIT_ASSERT(!ris->KnownSize()); CPPUNIT_ASSERT_EQUAL(offset_type(0), ris->GetOffset()); - Error error; char buffer[16]; size_t nbytes = ris->Read(buffer, 2); CPPUNIT_ASSERT_EQUAL(size_t(2), nbytes); diff --git a/test/test_translate_song.cxx b/test/test_translate_song.cxx index 8b33a5c02..3b042b216 100644 --- a/test/test_translate_song.cxx +++ b/test/test_translate_song.cxx @@ -15,7 +15,6 @@ #include "Log.hxx" #include "db/DatabaseSong.hxx" #include "storage/plugins/LocalStorage.hxx" -#include "util/Error.hxx" #include "Mapper.hxx" #include