diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h index 82463eb68fe269904413e03a3b6fbf7a83cf2b20..80585938d70729bb166f13b7c3224ab97bc96bbf 100644 --- a/inc/lektor/commands.h +++ b/inc/lektor/commands.h @@ -88,7 +88,8 @@ bool command_noidle(struct lkt_state *srv, size_t c, char *[LKT_MESSAGE_ARGS_MAX bool command_find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], long continuation, database_search_init_func init); -/* Set options for the lektor such as `random`, `single`, `repeat`, etc */ +/* Set options for the lektor such as `random`, `single`, `repeat`, etc. Comes + * with helpers functions for callback support (trie structure). */ typedef enum { LKT_PLAYBACK_OPTION_NONE, LKT_PLAYBACK_OPTION_RANDOM, @@ -98,8 +99,37 @@ typedef enum { LKT_PLAYBACK_OPTION_VOLUME, } LKT_PLAYBACK_OPTION; -bool command_set_playback_option(struct lkt_state *srv, size_t c, LKT_PLAYBACK_OPTION opt, - char *[LKT_MESSAGE_ARGS_MAX]); +bool command_set_playback_option(struct lkt_state *, size_t, LKT_PLAYBACK_OPTION, char *[LKT_MESSAGE_ARGS_MAX]); + +PRIVATE_FUNCTION bool +command_set_playback_option_random(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]) +{ + return command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_RANDOM, args); +} + +PRIVATE_FUNCTION bool +command_set_playback_option_repeat(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]) +{ + return command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_REPEAT, args); +} + +PRIVATE_FUNCTION bool +command_set_playback_option_volume(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]) +{ + return command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_VOLUME, args); +} + +PRIVATE_FUNCTION bool +command_set_playback_option_single(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]) +{ + return command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_SINGLE, args); +} + +PRIVATE_FUNCTION bool +command_set_playback_option_consume(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_MAX]) +{ + return command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_CONSUME, args); +} /* Authentificate users */ bool command_password(struct lkt_state *srv, size_t c, char *[LKT_MESSAGE_ARGS_MAX]); diff --git a/src/net/listen.c b/src/net/listen.c index d32a2019ae11961c0ad4508aed23033dfaa7bba8..0b4c5379bda5cae3f67ebd95a69862ee7bb63510 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -26,15 +26,10 @@ #define CHARS_MAX (sizeof(char) * 256) typedef enum { - /* Not a terminal node, so no commands */ - LKT_COMMAND_NULL, - - /* Some common types of commands */ - LKT_COMMAND_SIMPLE, /* srv, c, args */ - LKT_COMMAND_INTEGER, /* srv, c, args, int */ - LKT_COMMAND_ANON, /* srv, args */ - - /* Some specialized types... */ + LKT_COMMAND_NULL, /* Not a terminal node, so no commands */ + LKT_COMMAND_SIMPLE, /* srv, c, args */ + LKT_COMMAND_CONTINUATION, /* srv, c, args, int */ + LKT_COMMAND_ANON, /* srv, args */ } LKT_COMMAND_TYPE; struct cmd_trie_node { @@ -153,7 +148,7 @@ ___cmd_trie_print(struct cmd_trie_node *root, char *old_prefix, const size_t len /* A terminal node */ case LKT_COMMAND_SIMPLE: case LKT_COMMAND_ANON: - case LKT_COMMAND_INTEGER: + case LKT_COMMAND_CONTINUATION: LKT_OUTPUT("CMD_TRIE", "Got function of type %d in trie '%s'", root->type, prefix); break; } @@ -212,6 +207,12 @@ ___cmd_trie_init(void) cmd_trie_insert(cmd_trie_root, "swapid", FUNCTION_POINTER(command_swapid), LKT_COMMAND_ANON); cmd_trie_insert(cmd_trie_root, "__flat", FUNCTION_POINTER(command_flat), LKT_COMMAND_ANON); + cmd_trie_insert(cmd_trie_root, "random", FUNCTION_POINTER(command_set_playback_option_random), LKT_COMMAND_SIMPLE); + cmd_trie_insert(cmd_trie_root, "repeat", FUNCTION_POINTER(command_set_playback_option_repeat), LKT_COMMAND_SIMPLE); + cmd_trie_insert(cmd_trie_root, "setvol", FUNCTION_POINTER(command_set_playback_option_volume), LKT_COMMAND_SIMPLE); + cmd_trie_insert(cmd_trie_root, "single", FUNCTION_POINTER(command_set_playback_option_single), LKT_COMMAND_SIMPLE); + cmd_trie_insert(cmd_trie_root, "consume", FUNCTION_POINTER(command_set_playback_option_consume), LKT_COMMAND_SIMPLE); + cmd_trie_insert(cmd_trie_root, "playlistid", FUNCTION_POINTER(command_queue_listid), LKT_COMMAND_SIMPLE); cmd_trie_insert(cmd_trie_root, "playlist", FUNCTION_POINTER(command_queue_list), LKT_COMMAND_SIMPLE); cmd_trie_insert(cmd_trie_root, "playlistinfo", FUNCTION_POINTER(command_queue_list), LKT_COMMAND_SIMPLE); @@ -224,8 +225,8 @@ ___cmd_trie_init(void) cmd_trie_insert(cmd_trie_root, "save", FUNCTION_POINTER(command_plt_export), LKT_COMMAND_ANON); cmd_trie_insert(cmd_trie_root, "__plt_import", FUNCTION_POINTER(command_plt_import), LKT_COMMAND_ANON); cmd_trie_insert(cmd_trie_root, "__dump", FUNCTION_POINTER(command_dump), LKT_COMMAND_ANON); - cmd_trie_insert(cmd_trie_root, "listplaylists", FUNCTION_POINTER(command_plt_list), LKT_COMMAND_INTEGER); - cmd_trie_insert(cmd_trie_root, "listplaylist", FUNCTION_POINTER(command_plt_ctx), LKT_COMMAND_INTEGER); + cmd_trie_insert(cmd_trie_root, "listplaylists", FUNCTION_POINTER(command_plt_list), LKT_COMMAND_CONTINUATION); + cmd_trie_insert(cmd_trie_root, "listplaylist", FUNCTION_POINTER(command_plt_ctx), LKT_COMMAND_CONTINUATION); cmd_trie_insert(cmd_trie_root, "sticker", FUNCTION_POINTER(command_sticker_handle), LKT_COMMAND_SIMPLE); /* Commands that requires authentification. */ @@ -394,7 +395,7 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) break; /* Need the continuation */ - case LKT_COMMAND_INTEGER: + case LKT_COMMAND_CONTINUATION: err = ! handle_function.integer(srv, c, cmd.args, cmd.cont); break; @@ -407,34 +408,34 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) /* Some commands are not in the structure because they have a unique * way to handle arguments. */ - else if (STR_MATCH(cmd.name, "close")) + + else if (STR_MATCH(cmd.name, "close")) { err = !lkt_close_client(srv, c); - else if (STR_MATCH(cmd.name, "ping")) + } + + else if (STR_MATCH(cmd.name, "ping")) { err = 0; + } - else if (STR_MATCH(cmd.name, "listplaylistinfo")) + else if (STR_MATCH(cmd.name, "listplaylistinfo")) { err = !command_find(srv, c, cmd.args, cmd.cont, database_search_playlist_init); - - else if (STR_MATCH(cmd.name, "random")) - err = !command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_RANDOM, cmd.args); - else if (STR_MATCH(cmd.name, "repeat")) - err = !command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_REPEAT, cmd.args); - else if (STR_MATCH(cmd.name, "setvol")) - err = !command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_VOLUME, cmd.args); - else if (STR_MATCH(cmd.name, "single")) - err = !command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_SINGLE, cmd.args); - else if (STR_MATCH(cmd.name, "consume")) - err = !command_set_playback_option(srv, c, LKT_PLAYBACK_OPTION_CONSUME, cmd.args); + } else if (STR_MATCH(cmd.name, "idle")) { err = !command_idle(srv, c, cmd.args); goto end_no_send_status; - } else if (STR_MATCH(cmd.name, "search") || STR_MATCH(cmd.name, "find") || STR_MATCH(cmd.name, "list") || + } + + else if (STR_MATCH(cmd.name, "search") || STR_MATCH(cmd.name, "find") || STR_MATCH(cmd.name, "list") || STR_MATCH(cmd.name, "listall") || STR_MATCH(cmd.name, "listallinfo") || - STR_MATCH(cmd.name, "listfiles") || STR_MATCH(cmd.name, "lsinfo")) + STR_MATCH(cmd.name, "listfiles") || STR_MATCH(cmd.name, "lsinfo")) { err = !command_find(srv, c, cmd.args, cmd.cont, database_search_database_init); - else + } + + /* Not found! */ + else { err = 2; + } break; @@ -443,10 +444,16 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) if (STR_MATCH(cmd.name, "idle")) { err = !command_idle(srv, c, cmd.args); goto end_no_send_status; - } else if (STR_MATCH(cmd.name, "noidle")) + } + + else if (STR_MATCH(cmd.name, "noidle")) { err = !command_noidle(srv, c, NULL); - else + } + + /* Not found! */ + else { err = 2; + } break; }