aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--src/command/CommandError.cxx77
2 files changed, 56 insertions, 22 deletions
diff --git a/NEWS b/NEWS
index e9418889d..ac95df66a 100644
--- a/NEWS
+++ b/NEWS
@@ -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;
}