aboutsummaryrefslogtreecommitdiffstats
path: root/src/command/CommandError.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2015-11-11 19:49:17 +0100
committerMax Kellermann <max@duempel.org>2015-11-11 19:51:09 +0100
commit0f4f04eaa4b697ef95411516a3c2145a394e0c64 (patch)
tree8bfb08ba23521d190e119374ad9705edf39bcc90 /src/command/CommandError.cxx
parent2e55d561d35ed832d1f03ad4c5474ac0a32260fb (diff)
downloadmpd-0f4f04eaa4b697ef95411516a3c2145a394e0c64.tar.gz
mpd-0f4f04eaa4b697ef95411516a3c2145a394e0c64.tar.xz
mpd-0f4f04eaa4b697ef95411516a3c2145a394e0c64.zip
command/CommandError: send verbose error message to client
Diffstat (limited to 'src/command/CommandError.cxx')
-rw-r--r--src/command/CommandError.cxx77
1 files changed, 55 insertions, 22 deletions
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;
}