diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h index a884de214c7e5340bdfff055bdd83afae98ca8dd..3329c8a48a5e26e2799d045e74eae4251f1797ed 100644 --- a/inc/lektor/commands.h +++ b/inc/lektor/commands.h @@ -103,3 +103,4 @@ bool command_rescan(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS bool command_sticker_get(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]); bool command_sticker_set(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]); bool command_sticker_delete(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]); +bool command_sticker_list(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]); diff --git a/src/commands.c b/src/commands.c index a58f3d8be2c4806da6a49f4607bf2c3c8ce27ec6..b90846618522348ba60047a0c1fac6228938c1f2 100644 --- a/src/commands.c +++ b/src/commands.c @@ -21,6 +21,15 @@ #define SELF_EXECUTABLE_FREEBSD "/proc/curproc/file" #define SELF_EXECUTABLE_SOLARIS "/proc/self/path/a.out" +struct _client_trace_t { + struct lkt_state *srv; + size_t c; + int uri; + const char *name; + int value; + bool is_ok; +}; + inline bool command_restart(struct lkt_state *srv, size_t c) { @@ -549,11 +558,6 @@ command_noidle(struct lkt_state *srv, size_t c) } /* Functions for the searchadd and the search mpd commands */ -struct _client_trace_t { - struct lkt_state *srv; - size_t c; -}; - static bool lkt_callback_print_row_v1(void *args, int id, int id_len, const char *sql_row) { @@ -1098,9 +1102,68 @@ sticker_send_all(void *_args, const char *sticker, const char *type, int uri, in out = lkt_message_new(); out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "%s: %d\nsticker: %s\nvalue: %d\n", - type, uri, sticker, value); + type, uri, sticker, value); lkt_state_send(args->srv, args->c, out); - return false; + return true; +} + +static bool +sticker_send_check_uri(void *_args, const char *sticker, const char *type, int uri, int value) +{ + struct _client_trace_t *args = (struct _client_trace_t *) _args; + struct lkt_message *out; + (void) type; + + if (uri == args->uri) { + out = lkt_message_new(); + out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "%s: %d\n", sticker, value); + lkt_state_send(args->srv, args->c, out); + } + + return true; +} + +static bool +sticker_send_value_check_uri_name(void *_args, const char *sticker, const char *type, int uri, int value) +{ + struct _client_trace_t *args = (struct _client_trace_t *) _args; + struct lkt_message *out; + (void) type; + + if (uri == args->uri || !strcasecmp(sticker, args->name)) { + out = lkt_message_new(); + out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "value: %d\n", value); + lkt_state_send(args->srv, args->c, out); + } + + return true; +} + +static bool +sticker_check_is_present_eq(void *_args, const char *sticker, const char *type, int uri, int value) +{ + (void) type; + struct _client_trace_t *args = (struct _client_trace_t *) _args; + args->is_ok |= (uri == args->uri) && !strcasecmp(sticker, args->name) && (value == args->value); + return true; +} + +static bool +sticker_check_is_present_lt(void *_args, const char *sticker, const char *type, int uri, int value) +{ + (void) type; + struct _client_trace_t *args = (struct _client_trace_t *) _args; + args->is_ok |= (uri == args->uri) && !strcasecmp(sticker, args->name) && (value < args->value); + return true; +} + +static bool +sticker_check_is_present_gt(void *_args, const char *sticker, const char *type, int uri, int value) +{ + (void) type; + struct _client_trace_t *args = (struct _client_trace_t *) _args; + args->is_ok |= (uri == args->uri) && !strcasecmp(sticker, args->name) && (value > args->value); + return true; } bool @@ -1134,6 +1197,7 @@ command_sticker_set(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS return false; } + (void) c; int uri = atoi(argv[1]); /* FIXME: Use strtol. */ int value = atoi(argv[4]); /* FIXME: Use strtol. */ @@ -1147,7 +1211,69 @@ command_sticker_set(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS } bool -command_sticker_delete(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]) +command_sticker_list(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]) { + struct _client_trace_t args = { + .srv = srv, + .c = c, + }; + + /* Simple list {type} {uri} command */ + if (argv[0] != NULL && argv[1] != NULL && argv[2] == NULL) + goto simple_list_command; + + /* list {type} {uri} {name} command */ + else if (argv[0] != NULL && argv[1] != NULL && + argv[2] != NULL && argv[3] == NULL) + goto list_stickers_in_uri; + + /* list {type} {uri} {name} `op` {value} command */ + else if (argv[0] != NULL && argv[1] != NULL && + argv[2] != NULL && argv[3] != NULL && + argv[4] != NULL && argv[5] == NULL) + goto list_stickers_check_value; + + /* Just list all stickers */ + else if ( (argv[0] != NULL && argv[1] == NULL) || argv[0] == NULL ) + goto just_list_all; + + else + goto unknown; + +just_list_all: + return database_sticker_list(srv->db, argv[0], &args, sticker_send_all); + +simple_list_command: + args.uri = atoi(argv[1]); /* FIXME: Use strtol. */ + return database_sticker_list(srv->db, argv[0], &args, sticker_send_check_uri); + +list_stickers_in_uri: + args.uri = atoi(argv[1]); /* FIXME: Use strtol. */ + args.name = argv[2]; + return database_sticker_list(srv->db, argv[0], &args, sticker_send_value_check_uri_name); + return false; + +list_stickers_check_value: + args.uri = atoi(argv[1]); /* FIXME: Use strtol. */ + args.value = atoi(argv[4]); /* FIXME: Use strtol. */ + args.name = argv[2]; + switch (argv[3][0]) { + case '=': + return database_sticker_list(srv->db, argv[0], &args, sticker_check_is_present_eq); + case '<': + return database_sticker_list(srv->db, argv[0], &args, sticker_check_is_present_lt); + case '>': + return database_sticker_list(srv->db, argv[0], &args, sticker_check_is_present_gt); + default: + return 0; + } + +unknown: + fprintf(stderr, " . command_sticker_list: Specified command is invalid or unknown\n"); + return false; } +// bool +// command_sticker_delete(struct lkt_state *srv, size_t c, char *argv[LKT_MESSAGE_ARGS_MAX]) +// { +// } diff --git a/src/net/listen.c b/src/net/listen.c index 049cf75e93610c3cf20cdd397c723de2afc452bf..c8df599b0b13750b2f2cbba5ceb10252db8eec99 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -647,8 +647,7 @@ handle_idle_events(struct lkt_state *srv) } enum mpd_idle_flag * -lkt_client_get_mask(struct lkt_state *srv, size_t c) -{ +lkt_client_get_mask(struct lkt_state *srv, size_t c) { return &(srv->clients[c - 1].mpd_idle_watch); }