summaryrefslogtreecommitdiff
path: root/src/d_bus_commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/d_bus_commands.c')
-rw-r--r--src/d_bus_commands.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/d_bus_commands.c b/src/d_bus_commands.c
new file mode 100644
index 0000000..8ae2351
--- /dev/null
+++ b/src/d_bus_commands.c
@@ -0,0 +1,102 @@
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include "d_bus_commands.h"
+#include <d_bus_variant.h>
+
+void print_command_help(const universal_command_t* cmds)
+{
+ printf("Power commands list: \n");
+ for(const universal_command_t* current=cmds;current->name!=NULL;current++)
+ {
+ printf("\t %s - %s \n", current->name, current->help);
+ }
+}
+
+int parse_command2enum(const char* command, const universal_command_t* cmds)
+{
+ int result = COMMAND_UNKNOWN;
+ for(const universal_command_t* current=cmds;current->name!=NULL;current++)
+ {
+ if(strcmp(command, current->name)==0)
+ result = current->command;
+ }
+ return result;
+}
+
+const universal_command_t* get_command_by_enum(int cmd, const universal_command_t* cmds)
+{
+ for(const universal_command_t* cur_cmd = cmds; cur_cmd->name != NULL; cur_cmd++)
+ {
+ if(cur_cmd->command == cmd)
+ return cur_cmd;
+ }
+ return NULL;
+}
+
+const string_quadruple_t* get_dbus_command_interface(int cmd, const command_dbus_path_t* pathes)
+{
+ for(const command_dbus_path_t* current = pathes; current->path!=NULL; current++)
+ {
+ if(current->command == cmd)return current->path;
+ }
+ return NULL;
+}
+
+
+const dbus_value_variant_t* get_dbus_command_member(int cmd, const command_dbus_member_t* values)
+{
+ for(const command_dbus_member_t* current = values; current->member.type != NULL; current++)
+ {
+ if(current->command == cmd)return &(current->member);
+ }
+ return NULL;
+}
+
+
+const char* get_dbus_command_member_string(int cmd, const command_dbus_member_t* values)
+{
+ for(const command_dbus_member_t* current = values; current->member.type != NULL; current++)
+ {
+ if(current->command == cmd)return dbus_variant_get_string(&(current->member));
+ }
+ return NULL;
+}
+
+const dbus_value_variant_t* get_dbus_command_member_variant(int cmd, const command_dbus_member_t* values)
+{
+ for(const command_dbus_member_t* current = values; current->member.type != NULL; current++)
+ {
+ if(current->command == cmd)return &(current->member);
+ }
+ return NULL;
+}
+
+const command_dbus_member_t* get_dbus_command_by_member(const char* member, const command_dbus_member_t* values)
+{
+ for(const command_dbus_member_t* current = values; current->member.type != NULL; current++)
+ {
+
+ if(strcmp(member, dbus_variant_get_string(&current->member)) == 0 )return current;
+ }
+ return NULL;
+}
+
+int com_dbus_property( char *arg, const universal_command_t* commands, const command_dbus_path_t* paths, const command_dbus_member_t* values)
+{
+ int cmd = parse_command2enum(arg, commands);
+ if(cmd==COMMAND_UNKNOWN) {
+ fprintf(stderr, "Unknown command: %s\n", arg);
+ print_command_help(commands);
+ return -EOPNOTSUPP;
+ }
+ const string_quadruple_t* dbus_power_interface = get_dbus_command_interface(cmd, paths);
+ if(!dbus_power_interface)
+ return -EOPNOTSUPP;
+ const dbus_value_variant_t* property_val = get_dbus_command_member_variant(cmd, values);
+ if(!property_val)
+ return -EOPNOTSUPP;
+ return dbus_set_property(dbus_power_interface, *property_val);
+ return 0;
+}