mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2025-01-23 20:54:14 +01:00
client: cmd argument completion based on properties
This commit is contained in:
parent
7882390e81
commit
e04df7f282
@ -44,6 +44,27 @@ static struct l_dbus *dbus;
|
|||||||
static struct l_queue *proxy_interfaces;
|
static struct l_queue *proxy_interfaces;
|
||||||
static struct l_queue *proxy_interface_types;
|
static struct l_queue *proxy_interface_types;
|
||||||
|
|
||||||
|
static const void *proxy_interface_property_tostr(
|
||||||
|
const struct proxy_interface *proxy,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
const struct proxy_interface_property *property_table =
|
||||||
|
proxy->type->properties;
|
||||||
|
|
||||||
|
for (i = 0; property_table[i].name; i++) {
|
||||||
|
if (strcmp(property_table[i].name, name))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!property_table[i].tostr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
return property_table[i].tostr(proxy->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void proxy_interface_property_set(struct proxy_interface *proxy,
|
static void proxy_interface_property_set(struct proxy_interface *proxy,
|
||||||
const char *name,
|
const char *name,
|
||||||
struct l_dbus_message_iter *variant)
|
struct l_dbus_message_iter *variant)
|
||||||
@ -85,6 +106,43 @@ static void interface_update_properties(struct proxy_interface *proxy,
|
|||||||
proxy_interface_property_set(proxy, name, NULL);
|
proxy_interface_property_set(proxy, name, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *proxy_property_str_completion(const struct proxy_interface_type *type,
|
||||||
|
proxy_property_match_func_t function,
|
||||||
|
const char *property_name,
|
||||||
|
const char *value, int state)
|
||||||
|
{
|
||||||
|
static struct l_queue *match;
|
||||||
|
static const struct l_queue_entry *entry;
|
||||||
|
|
||||||
|
if (!state) {
|
||||||
|
match = proxy_interface_find_all(type->interface, function,
|
||||||
|
value);
|
||||||
|
if (!match)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
entry = l_queue_get_entries(match);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (entry) {
|
||||||
|
const struct proxy_interface *proxy = entry->data;
|
||||||
|
const char *str;
|
||||||
|
|
||||||
|
entry = entry->next;
|
||||||
|
|
||||||
|
str = proxy_interface_property_tostr(proxy, property_name);
|
||||||
|
if (!str)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return l_strdup(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
l_queue_destroy(match, NULL);
|
||||||
|
match = NULL;
|
||||||
|
entry = NULL;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
bool dbus_message_has_error(struct l_dbus_message *message)
|
bool dbus_message_has_error(struct l_dbus_message *message)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -70,6 +70,11 @@ bool proxy_interface_method_call(const struct proxy_interface *proxy,
|
|||||||
const char *name, const char *signature,
|
const char *name, const char *signature,
|
||||||
l_dbus_message_func_t callback, ...);
|
l_dbus_message_func_t callback, ...);
|
||||||
|
|
||||||
|
char *proxy_property_str_completion(const struct proxy_interface_type *type,
|
||||||
|
proxy_property_match_func_t function,
|
||||||
|
const char *property_name,
|
||||||
|
const char *value, int state);
|
||||||
|
|
||||||
void *proxy_interface_get_data(const struct proxy_interface *proxy);
|
void *proxy_interface_get_data(const struct proxy_interface *proxy);
|
||||||
const char *proxy_interface_get_interface(const struct proxy_interface *proxy);
|
const char *proxy_interface_get_interface(const struct proxy_interface *proxy);
|
||||||
const char *proxy_interface_get_identity_str(
|
const char *proxy_interface_get_identity_str(
|
||||||
|
@ -341,6 +341,14 @@ static bool match_by_name(const void *a, const void *b)
|
|||||||
return !strcmp(device->name, name);
|
return !strcmp(device->name, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool match_by_partial_name(const void *a, const void *b)
|
||||||
|
{
|
||||||
|
const struct device *device = a;
|
||||||
|
const char *text = b;
|
||||||
|
|
||||||
|
return !strncmp(device->name, text, strlen(text));
|
||||||
|
}
|
||||||
|
|
||||||
static const struct proxy_interface *get_device_proxy_by_name(
|
static const struct proxy_interface *get_device_proxy_by_name(
|
||||||
const char *device_name)
|
const char *device_name)
|
||||||
{
|
{
|
||||||
@ -471,7 +479,33 @@ static const struct command device_commands[] = {
|
|||||||
|
|
||||||
static char *family_arg_completion(const char *text, int state)
|
static char *family_arg_completion(const char *text, int state)
|
||||||
{
|
{
|
||||||
return NULL;
|
static bool first_pass;
|
||||||
|
static size_t index;
|
||||||
|
static size_t len;
|
||||||
|
const char *cmd;
|
||||||
|
|
||||||
|
if (!state) {
|
||||||
|
index = 0;
|
||||||
|
len = strlen(text);
|
||||||
|
first_pass = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((cmd = device_commands[index].cmd)) {
|
||||||
|
if (device_commands[index++].entity)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!strncmp(cmd, text, len))
|
||||||
|
return l_strdup(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first_pass) {
|
||||||
|
state = 0;
|
||||||
|
first_pass = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return proxy_property_str_completion(&device_interface_type,
|
||||||
|
match_by_partial_name, "Name",
|
||||||
|
text, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *entity_arg_completion(const char *text, int state)
|
static char *entity_arg_completion(const char *text, int state)
|
||||||
|
Loading…
Reference in New Issue
Block a user