Commit 0f4f04ea authored by Max Kellermann's avatar Max Kellermann

command/CommandError: send verbose error message to client

parent 2e55d561
...@@ -6,6 +6,7 @@ ver 0.20 (not yet released) ...@@ -6,6 +6,7 @@ ver 0.20 (not yet released)
- "sticker find" can match sticker values - "sticker find" can match sticker values
- drop the "file:///" prefix for absolute file paths - drop the "file:///" prefix for absolute file paths
- add range parameter to command "plchanges" and "plchangesposid" - add range parameter to command "plchanges" and "plchangesposid"
- send verbose error message to client
* tags * tags
- ape, ogg: drop support for non-standard tag "album artist" - ape, ogg: drop support for non-standard tag "album artist"
affected filetypes: vorbis, flac, opus & all files with ape2 tags affected filetypes: vorbis, flac, opus & all files with ape2 tags
......
...@@ -29,6 +29,41 @@ ...@@ -29,6 +29,41 @@
#include <string.h> #include <string.h>
#include <errno.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 CommandResult
print_playlist_result(Response &r, PlaylistResult result) print_playlist_result(Response &r, PlaylistResult result)
{ {
...@@ -82,43 +117,41 @@ print_playlist_result(Response &r, PlaylistResult result) ...@@ -82,43 +117,41 @@ print_playlist_result(Response &r, PlaylistResult result)
return CommandResult::ERROR; return CommandResult::ERROR;
} }
CommandResult gcc_pure
print_error(Response &r, const Error &error) static enum ack
ToAck(const Error &error)
{ {
assert(error.IsDefined());
LogError(error);
if (error.IsDomain(playlist_domain)) { if (error.IsDomain(playlist_domain)) {
return print_playlist_result(r, return ToAck((PlaylistResult)error.GetCode());
PlaylistResult(error.GetCode()));
} else if (error.IsDomain(ack_domain)) { } else if (error.IsDomain(ack_domain)) {
r.Error((ack)error.GetCode(), error.GetMessage()); return (enum ack)error.GetCode();
return CommandResult::ERROR;
#ifdef ENABLE_DATABASE #ifdef ENABLE_DATABASE
} else if (error.IsDomain(db_domain)) { } else if (error.IsDomain(db_domain)) {
switch ((enum db_error)error.GetCode()) { switch ((enum db_error)error.GetCode()) {
case DB_DISABLED: case DB_DISABLED:
r.Error(ACK_ERROR_NO_EXIST, error.GetMessage());
return CommandResult::ERROR;
case DB_NOT_FOUND: case DB_NOT_FOUND:
r.Error(ACK_ERROR_NO_EXIST, "Not found"); return ACK_ERROR_NO_EXIST;
return CommandResult::ERROR;
case DB_CONFLICT: case DB_CONFLICT:
r.Error(ACK_ERROR_ARG, "Conflict"); return ACK_ERROR_ARG;
return CommandResult::ERROR;
} }
#endif #endif
} else if (error.IsDomain(locate_uri_domain)) { } else if (error.IsDomain(locate_uri_domain)) {
r.Error(ACK_ERROR_ARG, error.GetMessage()); return ACK_ERROR_ARG;
return CommandResult::ERROR;
} else if (error.IsDomain(errno_domain)) { } else if (error.IsDomain(errno_domain)) {
r.Error(ACK_ERROR_SYSTEM, strerror(error.GetCode())); return ACK_ERROR_SYSTEM;
return CommandResult::ERROR;
} }
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; return CommandResult::ERROR;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment