Refactor comand and event name parsing
Signed-off-by: Jim Ramsay <i.am@jimramsay.com>pull/201/head
parent
4def8f3cb8
commit
d75ca4bf51
|
@ -48,5 +48,13 @@ struct cmd_info {
|
||||||
struct cmd_param_info params[5];
|
struct cmd_param_info params[5];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum cmd_type ctl_command_parse_name(const char* name);
|
||||||
|
struct cmd_info* ctl_command_by_type(enum cmd_type type);
|
||||||
|
struct cmd_info* ctl_command_by_name(const char* name);
|
||||||
|
|
||||||
|
enum event_type ctl_event_parse_name(const char* name);
|
||||||
|
struct cmd_info* ctl_event_by_type(enum event_type type);
|
||||||
|
struct cmd_info* ctl_event_by_name(const char* name);
|
||||||
|
|
||||||
extern struct cmd_info ctl_command_list[];
|
extern struct cmd_info ctl_command_list[];
|
||||||
extern struct cmd_info ctl_event_list[];
|
extern struct cmd_info ctl_event_list[];
|
||||||
|
|
|
@ -119,6 +119,7 @@ ctlsources = [
|
||||||
'src/util.c',
|
'src/util.c',
|
||||||
'src/json-ipc.c',
|
'src/json-ipc.c',
|
||||||
'src/ctl-client.c',
|
'src/ctl-client.c',
|
||||||
|
'src/ctl-commands.c',
|
||||||
'src/strlcpy.c',
|
'src/strlcpy.c',
|
||||||
'src/option-parser.c',
|
'src/option-parser.c',
|
||||||
]
|
]
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#include "json-ipc.h"
|
#include "json-ipc.h"
|
||||||
#include "ctl-client.h"
|
#include "ctl-client.h"
|
||||||
|
#include "ctl-commands.h"
|
||||||
#include "ctl-server.h"
|
#include "ctl-server.h"
|
||||||
#include "strlcpy.h"
|
#include "strlcpy.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
@ -438,18 +439,31 @@ static void pretty_output_list(json_t* data)
|
||||||
static void pretty_print(json_t* data,
|
static void pretty_print(json_t* data,
|
||||||
struct jsonipc_request* request)
|
struct jsonipc_request* request)
|
||||||
{
|
{
|
||||||
const char* method = request->method;
|
enum cmd_type cmd = ctl_command_parse_name(request->method);
|
||||||
if (strcmp(method, "help") == 0)
|
switch (cmd) {
|
||||||
|
case CMD_HELP:
|
||||||
print_help(data, request->params);
|
print_help(data, request->params);
|
||||||
else if (strcmp(method, "version") == 0)
|
break;
|
||||||
|
case CMD_VERSION:
|
||||||
pretty_version(data);
|
pretty_version(data);
|
||||||
else if (strcmp(method, "get-clients") == 0)
|
break;
|
||||||
|
case CMD_GET_CLIENTS:
|
||||||
pretty_client_list(data);
|
pretty_client_list(data);
|
||||||
else if (strcmp(method, "get-outputs") == 0)
|
break;
|
||||||
|
case CMD_GET_OUTPUTS:
|
||||||
pretty_output_list(data);
|
pretty_output_list(data);
|
||||||
else
|
break;
|
||||||
|
case CMD_DISCONNECT_CLIENT:
|
||||||
|
case CMD_SET_OUTPUT:
|
||||||
|
case CMD_WAYVNC_EXIT:
|
||||||
|
printf("Ok\n");
|
||||||
|
break;
|
||||||
|
case CMD_EVENT_RECEIVE:
|
||||||
|
abort(); // Event loop code handles this one
|
||||||
|
case CMD_UNKNOWN:
|
||||||
json_dumpf(data, stdout, JSON_INDENT(2));
|
json_dumpf(data, stdout, JSON_INDENT(2));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void print_compact_json(json_t* data)
|
static void print_compact_json(json_t* data)
|
||||||
{
|
{
|
||||||
|
@ -710,10 +724,15 @@ int ctl_client_run_command(struct ctl_client* self,
|
||||||
if (!request)
|
if (!request)
|
||||||
goto parse_failure;
|
goto parse_failure;
|
||||||
|
|
||||||
if (strcmp(request->method, "event-receive") == 0)
|
enum cmd_type cmd = ctl_command_parse_name(request->method);
|
||||||
|
switch (cmd) {
|
||||||
|
case CMD_EVENT_RECEIVE:
|
||||||
result = ctl_client_event_loop(self, request);
|
result = ctl_client_event_loop(self, request);
|
||||||
else
|
break;
|
||||||
|
default:
|
||||||
result = ctl_client_print_single_command(self, request);
|
result = ctl_client_print_single_command(self, request);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
jsonipc_request_destroy(request);
|
jsonipc_request_destroy(request);
|
||||||
parse_failure:
|
parse_failure:
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "ctl-commands.h"
|
#include "ctl-commands.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
struct cmd_info ctl_command_list[] = {
|
struct cmd_info ctl_command_list[] = {
|
||||||
[CMD_HELP] = { "help",
|
[CMD_HELP] = { "help",
|
||||||
|
@ -90,3 +91,51 @@ struct cmd_info ctl_event_list[] = {
|
||||||
},
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum cmd_type ctl_command_parse_name(const char* name)
|
||||||
|
{
|
||||||
|
if (!name || name[0] == '\0')
|
||||||
|
return CMD_UNKNOWN;
|
||||||
|
for (size_t i = 0; i < CMD_LIST_LEN; ++i) {
|
||||||
|
if (strcmp(name, ctl_command_list[i].name) == 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CMD_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum event_type ctl_event_parse_name(const char* name)
|
||||||
|
{
|
||||||
|
if (!name || name[0] == '\0')
|
||||||
|
return EVT_UNKNOWN;
|
||||||
|
for (size_t i = 0; i < EVT_LIST_LEN; ++i) {
|
||||||
|
if (strcmp(name, ctl_event_list[i].name) == 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return EVT_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cmd_info* ctl_command_by_type(enum cmd_type cmd)
|
||||||
|
{
|
||||||
|
if (cmd == CMD_UNKNOWN)
|
||||||
|
return NULL;
|
||||||
|
return &ctl_command_list[cmd];
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cmd_info* ctl_command_by_name(const char* name)
|
||||||
|
{
|
||||||
|
return ctl_command_by_type(ctl_command_parse_name(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cmd_info* ctl_event_by_type(enum event_type evt)
|
||||||
|
{
|
||||||
|
if (evt == EVT_UNKNOWN)
|
||||||
|
return NULL;
|
||||||
|
return &ctl_event_list[evt];
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cmd_info* ctl_event_by_name(const char* name)
|
||||||
|
{
|
||||||
|
return ctl_event_by_type(ctl_event_parse_name(name));
|
||||||
|
}
|
||||||
|
|
|
@ -105,18 +105,6 @@ static void cmd_response_destroy(struct cmd_response* self)
|
||||||
free(self);
|
free(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum cmd_type parse_command_name(const char* name)
|
|
||||||
{
|
|
||||||
if (!name || name[0] == '\0')
|
|
||||||
return CMD_UNKNOWN;
|
|
||||||
for (int i = 0; i < CMD_LIST_LEN; ++i) {
|
|
||||||
if (strcmp(name, ctl_command_list[i].name) == 0) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return CMD_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct cmd_help* cmd_help_new(json_t* args,
|
static struct cmd_help* cmd_help_new(json_t* args,
|
||||||
struct jsonipc_error* err)
|
struct jsonipc_error* err)
|
||||||
{
|
{
|
||||||
|
@ -218,7 +206,7 @@ static struct cmd* parse_command(struct jsonipc_request* ipc,
|
||||||
struct jsonipc_error* err)
|
struct jsonipc_error* err)
|
||||||
{
|
{
|
||||||
nvnc_trace("Parsing command %s", ipc->method);
|
nvnc_trace("Parsing command %s", ipc->method);
|
||||||
enum cmd_type cmd_type = parse_command_name(ipc->method);
|
enum cmd_type cmd_type = ctl_command_parse_name(ipc->method);
|
||||||
struct cmd* cmd = NULL;
|
struct cmd* cmd = NULL;
|
||||||
switch (cmd_type) {
|
switch (cmd_type) {
|
||||||
case CMD_HELP:
|
case CMD_HELP:
|
||||||
|
@ -323,22 +311,11 @@ static json_t* client_next_object(struct ctl_client* self, struct cmd_response**
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cmd_info* find_info(const char* id, struct cmd_info (*list)[],
|
|
||||||
size_t len)
|
|
||||||
{
|
|
||||||
for (size_t i = 0; i < len; ++i) {
|
|
||||||
struct cmd_info* info = &(*list)[i];
|
|
||||||
if (strcmp(info->name, id) == 0)
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct cmd_response* generate_help_object(const char* id, bool id_is_command)
|
static struct cmd_response* generate_help_object(const char* id, bool id_is_command)
|
||||||
{
|
{
|
||||||
struct cmd_info* info = id_is_command ?
|
struct cmd_info* info = id_is_command ?
|
||||||
find_info(id, &ctl_command_list, CMD_LIST_LEN) :
|
ctl_command_by_name(id) :
|
||||||
find_info(id, &ctl_event_list, EVT_LIST_LEN);
|
ctl_event_by_name(id);
|
||||||
json_t* data;
|
json_t* data;
|
||||||
if (!info) {
|
if (!info) {
|
||||||
data = json_pack("{s:o, s:o}",
|
data = json_pack("{s:o, s:o}",
|
||||||
|
@ -416,8 +393,8 @@ static struct cmd_response* generate_output_list(struct ctl* self)
|
||||||
static struct cmd_response* ctl_server_dispatch_cmd(struct ctl* self,
|
static struct cmd_response* ctl_server_dispatch_cmd(struct ctl* self,
|
||||||
struct ctl_client* client, struct cmd* cmd)
|
struct ctl_client* client, struct cmd* cmd)
|
||||||
{
|
{
|
||||||
assert(cmd->type != CMD_UNKNOWN);
|
const struct cmd_info* info = ctl_command_by_type(cmd->type);
|
||||||
const struct cmd_info* info = &ctl_command_list[cmd->type];
|
assert(info);
|
||||||
nvnc_log(NVNC_LOG_INFO, "Dispatching control client command '%s'", info->name);
|
nvnc_log(NVNC_LOG_INFO, "Dispatching control client command '%s'", info->name);
|
||||||
struct cmd_response* response = NULL;
|
struct cmd_response* response = NULL;
|
||||||
switch (cmd->type) {
|
switch (cmd->type) {
|
||||||
|
|
Loading…
Reference in New Issue