summaryrefslogtreecommitdiff
path: root/src/d_bus_commands.c
blob: 8ae2351b993957f785e16b100625b0cc2dc0cf22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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;
}