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)
- "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
......
......@@ -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;
}
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