client: add tag_mask attribute

The "tagtypes" command now has several sub commands which can be used
to edit that mask.
This commit is contained in:
Max Kellermann
2017-02-07 16:52:59 +01:00
parent 599d77643b
commit 29453ba196
10 changed files with 175 additions and 21 deletions

View File

@@ -187,7 +187,7 @@ static constexpr struct command commands[] = {
{ "subscribe", PERMISSION_READ, 1, 1, handle_subscribe },
{ "swap", PERMISSION_CONTROL, 2, 2, handle_swap },
{ "swapid", PERMISSION_CONTROL, 2, 2, handle_swapid },
{ "tagtypes", PERMISSION_READ, 0, 0, handle_tagtypes },
{ "tagtypes", PERMISSION_READ, 0, -1, handle_tagtypes },
{ "toggleoutput", PERMISSION_ADMIN, 1, 1, handle_toggleoutput },
#ifdef ENABLE_DATABASE
{ "unmount", PERMISSION_ADMIN, 1, 1, handle_unmount },

View File

@@ -24,6 +24,8 @@
#include "client/Client.hxx"
#include "client/Response.hxx"
#include "TagPrint.hxx"
#include "tag/ParseName.hxx"
#include "util/StringAPI.hxx"
CommandResult
handle_close(gcc_unused Client &client, gcc_unused Request args,
@@ -53,10 +55,58 @@ handle_password(Client &client, Request args, Response &r)
return CommandResult::OK;
}
CommandResult
handle_tagtypes(gcc_unused Client &client, gcc_unused Request request,
Response &r)
static TagMask
ParseTagMask(Request request)
{
tag_print_types(r);
return CommandResult::OK;
if (request.IsEmpty())
throw ProtocolError(ACK_ERROR_ARG, "Not enough arguments");
TagMask result = TagMask::None();
for (const char *name : request) {
auto type = tag_name_parse_i(name);
if (type == TAG_NUM_OF_ITEM_TYPES)
throw ProtocolError(ACK_ERROR_ARG, "Unknown tag type");
result |= type;
}
return result;
}
CommandResult
handle_tagtypes(Client &client, Request request, Response &r)
{
if (request.IsEmpty()) {
tag_print_types(r);
return CommandResult::OK;
}
const char *cmd = request.shift();
if (StringIsEqual(cmd, "all")) {
if (!request.IsEmpty()) {
r.Error(ACK_ERROR_ARG, "Too many arguments");
return CommandResult::ERROR;
}
client.tag_mask = TagMask::All();
return CommandResult::OK;
} else if (StringIsEqual(cmd, "clear")) {
if (!request.IsEmpty()) {
r.Error(ACK_ERROR_ARG, "Too many arguments");
return CommandResult::ERROR;
}
client.tag_mask = TagMask::None();
return CommandResult::OK;
} else if (StringIsEqual(cmd, "enable")) {
client.tag_mask |= ParseTagMask(request);
return CommandResult::OK;
} else if (StringIsEqual(cmd, "disable")) {
client.tag_mask &= ~ParseTagMask(request);
return CommandResult::OK;
} else {
r.Error(ACK_ERROR_ARG, "Unknown sub command");
return CommandResult::ERROR;
}
}

View File

@@ -97,7 +97,8 @@ print_tag(TagType type, const char *value, void *ctx)
{
auto &r = *(Response *)ctx;
tag_print(r, type, value);
if (r.GetClient().tag_mask.Test(type))
tag_print(r, type, value);
}
CommandResult