diff options
Diffstat (limited to 'src/dbus_common.c')
-rw-r--r-- | src/dbus_common.c | 84 |
1 files changed, 69 insertions, 15 deletions
diff --git a/src/dbus_common.c b/src/dbus_common.c index dd3bae5..6e05524 100644 --- a/src/dbus_common.c +++ b/src/dbus_common.c @@ -12,40 +12,60 @@ #include "dbus_common.h" #include "eulogium.h" #include "eulogium_item_list.h" +#include "procedures.h" -void on_method_generic_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +void on_method_generic_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { + const char *errname, *errmsg; - struct list_item *item = data; + if (eldbus_message_error_get(msg, &errname, &errmsg)) { + EINA_LOG_ERR("%s %s", errname, errmsg); + return; + } +} + +void on_method_generic_bool_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ const char *errname, *errmsg; - Eina_Bool state; + Eina_Bool ret; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); return; } + if (!eldbus_message_arguments_get(msg, "b", &ret)) { + EINA_LOG_ERR("Signature mismatch, \"b\"."); + return; + } + if (ret) + EINA_LOG_INFO("Ran %s successfully.", (char *)data); + else + EINA_LOG_WARN("%s failed to run.", (char *)data); } +#define _TECH_ETHERNET "ethernet" +#define _TECH_WIFI "wifi" void on_method_get_network_info_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { struct eulogium_data *eulogium = data; /* TODO replace this by making networks direct via ** */ struct network_data *networks = NULL; const char *errname, *errmsg; - Eldbus_Message_Iter *array, *net_struct; - char *obj_path, *tech, *ipv4, *ipv6, *ssid, *dummy; + Eldbus_Message_Iter *array, *array_security, *net_struct; + char *obj_path, *state, *error, *ssid, *tech, *ipv4, *ipv6, *security; + uint8_t strength, favorite, immutable, autoconnect; uint_fast16_t i = 0; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); return; } - if (!eldbus_message_arguments_get(msg, "a(osssss)", &array)) { - EINA_LOG_ERR("Message content does not match expected \"a(osssss)\" signature. (%s)", eldbus_message_signature_get(msg)); + if (!eldbus_message_arguments_get(msg, "a(ossssybbbssas)", &array)) { + EINA_LOG_ERR("Message content does not match expected \"a(ossssybbbssas)\" signature. (%s)", eldbus_message_signature_get(msg)); return; } - while (eldbus_message_iter_get_and_next(array, 'r', &net_struct)) - if (!eldbus_message_iter_arguments_get(net_struct, "osssss", &obj_path, &tech, &ipv4, &ipv6, &ssid, &dummy)) { - EINA_LOG_ERR("Message content does not match expected \"osssss\" signature. (%s)", eldbus_message_signature_get(msg)); + while (eldbus_message_iter_get_and_next(array, 'r', &net_struct)) { + if (!eldbus_message_iter_arguments_get(net_struct, "ossssybbbssas", &obj_path, &state, &error, &ssid, &tech, &strength, &favorite, &immutable, &autoconnect, &ipv4, &ipv6, &array_security)) { + EINA_LOG_ERR("Message content does not match expected \"ossssybbbssas\" signature. (%s)", eldbus_message_signature_get(msg)); break; } else { networks = realloc(networks, (i + 2) * sizeof(struct network_data)); @@ -60,25 +80,59 @@ void on_method_get_network_info_ret(void *data, const Eldbus_Message *msg, Eldbu else strncpy(networks[i].obj_path, obj_path, obj_pathsize); - networks[i].tech = UNKNOWN; - if (strcmp(tech, _TECH_ETHERNET)) + networks[i].tech = TECH_UNKNOWN; + if (!strcmp(tech, _TECH_ETHERNET)) networks[i].tech = TECH_ETHERNET; - if (strcmp(tech, _TECH_WIFI)) + if (!strcmp(tech, _TECH_WIFI)) networks[i].tech = TECH_WIFI; strncpy(networks[i].ipv4, ipv4, IPV4_MAX_LEN); strncpy(networks[i].ipv6, ipv6, IPV6_MAX_LEN); strncpy(networks[i].ssid, ssid, SSID_MAX_LEN); + while (eldbus_message_iter_get_and_next(array_security, 's', &security)) + /* noop */; } i++; } + } + if (i < 1) + return; + networks[i].obj_path = NULL; /* sentinel */ eulogium->networks = networks; } -void on_signal_network_info_changed_ret(void *data, const Eldbus_Message *msg) +void on_signal_network_info_changed_ret(void *data, const Eldbus_Message *msg EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + + /* XXX TODO: Right now we ignore the received message and just assume data + * has changed and we request a new array. The received object path is thus also ignored. + */ + eldbus_proxy_call(eulogium->dbus.proxy[NETWORK], "getNetworkServicesInfo", on_method_get_network_info_ret, eulogium, -1, "b", 1); +} + +void on_method_get_procedure_metadata_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + const struct procedure_data *proc = data; + const char *errname, *errmsg; + Eldbus_Message_Iter *array; + + if (eldbus_message_error_get(msg, &errname, &errmsg)) { + EINA_LOG_ERR("%s %s", errname, errmsg); /* XXX do these need to be free'ed? FIXME! YES! They do */ + return; + } + if (!eldbus_message_arguments_get(msg, "a{sv}", &array)) { + EINA_LOG_ERR("Message content does not match expected \"a{sv}\" signature. (%s)", eldbus_message_signature_get(msg)); /* XXX this return value may need to be freed actually!! Yep they do.*/ + return; + } + eldbus_message_iter_dict_iterate(array, "sv", proc->parser, proc); +} + +/* XXX we are likely not getting a signal, but will deal with this on procedure start and procedure finished. */ +void on_signal_procedure_metadata_changed_ret(void *data, const Eldbus_Message *msg) { - on_method_get_network_info_ret(data, msg, NULL); + on_method_get_procedure_metadata_ret(data, msg, NULL); } void on_method_is_network_powered_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) |