diff options
author | Max Kellermann <max@duempel.org> | 2015-11-11 19:49:17 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2015-11-11 19:51:09 +0100 |
commit | 0f4f04eaa4b697ef95411516a3c2145a394e0c64 (patch) | |
tree | 8bfb08ba23521d190e119374ad9705edf39bcc90 | |
parent | 2e55d561d35ed832d1f03ad4c5474ac0a32260fb (diff) | |
download | mpd-0f4f04eaa4b697ef95411516a3c2145a394e0c64.tar.gz mpd-0f4f04eaa4b697ef95411516a3c2145a394e0c64.tar.xz mpd-0f4f04eaa4b697ef95411516a3c2145a394e0c64.zip |
command/CommandError: send verbose error message to client
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | src/command/CommandError.cxx | 77 |
2 files changed, 56 insertions, 22 deletions
@@ -6,6 +6,7 @@ ver 0.20 (not yet released) - "sticker find" can match sticker values - drop the "file:///" prefix for absolute file paths - add range parameter to command "plchanges" and "plchangesposid" + - send verbose error message to client * tags - ape, ogg: drop support for non-standard tag "album artist" affected filetypes: vorbis, flac, opus & all files with ape2 tags diff --git a/src/command/CommandError.cxx b/src/command/CommandError.cxx index d771fd60e..7ed23d864 100644 --- a/src/command/CommandError.cxx +++ b/src/command/CommandError.cxx @@ -29,6 +29,41 @@ #include <string.h> #include <errno.h> +gcc_const +static enum ack +ToAck(PlaylistResult result) +{ + switch (result) { + case PlaylistResult::SUCCESS: + break; + + case PlaylistResult::DENIED: + return ACK_ERROR_PERMISSION; + + case PlaylistResult::NO_SUCH_SONG: + case PlaylistResult::NO_SUCH_LIST: + return ACK_ERROR_NO_EXIST; + + case PlaylistResult::LIST_EXISTS: + return ACK_ERROR_EXIST; + + case PlaylistResult::BAD_NAME: + case PlaylistResult::BAD_RANGE: + return ACK_ERROR_ARG; + + case PlaylistResult::NOT_PLAYING: + return ACK_ERROR_PLAYER_SYNC; + + case PlaylistResult::TOO_LARGE: + return ACK_ERROR_PLAYLIST_MAX; + + case PlaylistResult::DISABLED: + break; + } + + return ACK_ERROR_UNKNOWN; +} + CommandResult print_playlist_result(Response &r, PlaylistResult result) { @@ -82,43 +117,41 @@ print_playlist_result(Response &r, PlaylistResult result) return CommandResult::ERROR; } -CommandResult -print_error(Response &r, const Error &error) +gcc_pure +static enum ack +ToAck(const Error &error) { - assert(error.IsDefined()); - - LogError(error); - if (error.IsDomain(playlist_domain)) { - return print_playlist_result(r, - PlaylistResult(error.GetCode())); + return ToAck((PlaylistResult)error.GetCode()); } else if (error.IsDomain(ack_domain)) { - r.Error((ack)error.GetCode(), error.GetMessage()); - return CommandResult::ERROR; + return (enum ack)error.GetCode(); #ifdef ENABLE_DATABASE } else if (error.IsDomain(db_domain)) { switch ((enum db_error)error.GetCode()) { case DB_DISABLED: - r.Error(ACK_ERROR_NO_EXIST, error.GetMessage()); - return CommandResult::ERROR; - case DB_NOT_FOUND: - r.Error(ACK_ERROR_NO_EXIST, "Not found"); - return CommandResult::ERROR; + return ACK_ERROR_NO_EXIST; case DB_CONFLICT: - r.Error(ACK_ERROR_ARG, "Conflict"); - return CommandResult::ERROR; + return ACK_ERROR_ARG; } #endif } else if (error.IsDomain(locate_uri_domain)) { - r.Error(ACK_ERROR_ARG, error.GetMessage()); - return CommandResult::ERROR; + return ACK_ERROR_ARG; } else if (error.IsDomain(errno_domain)) { - r.Error(ACK_ERROR_SYSTEM, strerror(error.GetCode())); - return CommandResult::ERROR; + return ACK_ERROR_SYSTEM; } - r.Error(ACK_ERROR_UNKNOWN, "error"); + return ACK_ERROR_UNKNOWN; +} + +CommandResult +print_error(Response &r, const Error &error) +{ + assert(error.IsDefined()); + + LogError(error); + + r.Error(ToAck(error), error.GetMessage()); return CommandResult::ERROR; } |